【专题2:电子工程师 之 上位机】 之 【26.QTableWidget的信号 (d)】

嵌入式工程师成长之路 系列文章 总目录
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路
原创不易,文章会持续更新
文章会同步到作者个人公众号上,感谢扫码关注

在这里插入图片描述

所有文章总目录:【嵌入式 无人机 电机控制】
原创视频总目录:【嵌入式 无人机 电机控制】

1.QTableWidget的信号

信号一般有两种类型:cell开头的和item开头的,前者指单元格事件,即空的单元格也会触发,后者指item事件,只有单元格中有item时,才会触发。

2.鼠标悬停事件

(1)cellEntered(int row, int column) :鼠标移动到单元格上,会触发此事件(空单元格也会触发)。

(2)itemEntered(QTableWidgetItem *item):鼠标移动到单元格上,并且该单元格上有item(QTableWidgetItem),才会触发此事件,空的单元格不会触发此事件。

a.槽函数:

public slots:
    //鼠标悬停事件,不支持设置的Widget,空的单元格也不会触发
    void ItemEntered(QTableWidgetItem *item);
    //鼠标悬停事件,空的单元格也能触发
void CellEntered(int row, int column);

b.代码:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //清空所有标题和内容
    //ui->tableWidget->clear();//这样仅仅是清空表格里面的item,行和列本身还是存在的。
    //通过将行和列都设置为0的方式,将整个表格都删除
    ui->tableWidget->setRowCount(0);
    ui->tableWidget->setColumnCount(0);

    ui->tableWidget->setColumnCount(4);
    //当单元格中的Item不需要显示时,该QTableWidgetItem的空间就会被清理释放
    //插入列的标题
    ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("列标题1"));
    ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem());
    ui->tableWidget->horizontalHeaderItem(1)->setText("列标题2");
    ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("列标题3"));
    ui->tableWidget->setHorizontalHeaderItem(3, new QTableWidgetItem("列标题4"));

    //在表格中创建3行
    ui->tableWidget->setRowCount(3);
    //插入行的标题
    ui->tableWidget->setVerticalHeaderItem(0, new QTableWidgetItem("行标题1"));
    ui->tableWidget->setVerticalHeaderItem(1, new QTableWidgetItem("行标题2"));
    ui->tableWidget->setVerticalHeaderItem(2, new QTableWidgetItem("行标题3"));

    //给单元格插入数据
    ui->tableWidget->setItem(0,0, new QTableWidgetItem("单元格11"));
    ui->tableWidget->setItem(0,1, new QTableWidgetItem("单元格12"));
    ui->tableWidget->setItem(0,2, new QTableWidgetItem("单元格13"));
    ui->tableWidget->setItem(0,3, new QTableWidgetItem("单元格14"));
    ui->tableWidget->setItem(1,0, new QTableWidgetItem("单元格21"));
    ui->tableWidget->setItem(1,1, new QTableWidgetItem("单元格22"));

    //插入widget图片,QLabel也是一个QWidget
    QLabel *img = new QLabel();
    QPixmap pix(":/myRes/picture.jpg");
    //缩放到和单元格的宽高一致
    pix = pix.scaled(ui->tableWidget->columnWidth(2), ui->tableWidget->rowHeight(2));
    img->setPixmap(pix);
    //通过setCellWidget插入图片
    ui->tableWidget->setCellWidget(2, 2, img);

    //打开鼠标跟踪事件
    ui->tableWidget->setMouseTracking(true);
}

//鼠标悬停事件,不支持设置的Widget,只有单元格中有创建QTableWidgetItem时,
//鼠标停在上面,才会触发此事件,如果时空的单元格,则不会触发
void Widget::ItemEntered(QTableWidgetItem *item)
{
    if (!item)
        return;
    qDebug()<<"row:"<<item->row()<<"column:"<<item->column();
}

//鼠标悬停事件,空的单元格也能触发
void  Widget::CellEntered(int row, int column)
{
    qDebug()<<"cell row:"<<row<<"column:"<<column;
}

3.单击和双击事件

这里只演示cell开头的槽函数,item开头的槽函数原理一样,但只能响应有item的单元格,空单元格不会触发。

(1)信号

cellClicked(int, int):单击事件。
cellDoubleClicked(int, int):双击事件。

(2)槽函数

public slots:
    void Click(int row, int column);
	void Double(int row, int column);

(3)代码

//打开鼠标跟踪事件
ui->tableWidget->setMouseTracking(true);
void Widget::Click(int row, int column)
{
    qDebug()<<"click:"<<row<<" "<<column;;
}

void Widget::Double(int row, int column)
{
    qDebug()<<"double:"<<row<<" "<<column;;
}

4.元素修改事件

先设置单元格的编辑事件触发条件,当前选择双击进入编辑状态。
【专题2:电子工程师 之 上位机】 之 【26.QTableWidget的信号 (d)】_第1张图片
(1)信号

cellChanged(int, int):在单元格中输入内容,按回车后,会触发此事件。

(2)槽函数

public slots:
void Change(int row, int column);

(3)代码

//打开鼠标跟踪事件
ui->tableWidget->setMouseTracking(true);
void Widget::Change(int row, int column)
{
    qDebug()<<"change:"<<row<<" "<<column;;
}

5.点击标题触发的事件

标题和普通单元格的差别:标题不能编辑,而普通单元格可以编辑。这个事件可以用来做排序(qt默认点击列标题栏会有升序或降序排序)。

(1)信号

void sectionClicked(int logicalIndex)

(2)槽函数

public slots:
void SectionClicked(int column);

(3)代码

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //打开鼠标跟踪事件
    ui->tableWidget->setMouseTracking(true);

    //设置标题栏点击事件
    //信号:void sectionClicked(int logicalIndex)
    QObject::connect(ui->tableWidget->horizontalHeader(), 	 SIGNAL(sectionClicked(int)),this, SLOT(SectionClicked(int)));
}

void Widget::SectionClicked(int column)
{
    qDebug()<<ui->tableWidget->horizontalHeaderItem(column);//获得列标题内容
}

你可能感兴趣的:(qt,嵌入式)