嵌入式工程师成长之路 系列文章 总目录 |
---|
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 |
原创不易,文章会持续更新 |
文章会同步到作者个人公众号上,感谢扫码关注 |
所有文章总目录:【嵌入式 无人机 电机控制】 |
---|
原创视频总目录:【嵌入式 无人机 电机控制】 |
信号一般有两种类型:cell开头的和item开头的,前者指单元格事件,即空的单元格也会触发,后者指item事件,只有单元格中有item时,才会触发。
(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;
}
这里只演示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;;
}
先设置单元格的编辑事件触发条件,当前选择双击进入编辑状态。
(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;;
}
标题和普通单元格的差别:标题不能编辑,而普通单元格可以编辑。这个事件可以用来做排序(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);//获得列标题内容
}