目录
1.1 插入QPushButtton,并响应Button事件
1. 在QTableWidget中插入QWiget
1.1 插入QPushButtton,并响应Button事件
QPushButton *pBtn = new QPushButton();
connect(pBtn, SIGNAL(clicked()), this, SLOT(OnBtnClicked()));
ui.tableWidget->setCellWidget(_row, _column, pBtn);
基于上面添加QPushButton的方式,获取button所在QTableWidget的行和列:
QPushButton *obj= (QPushButton*)sender();
int x = obj->frameGeometry().x();
int y = obj->frameGeometry().y();
QModelIndex index = ui.tableWidget->indexAt(QPoint(x, y));
int row = index.row();
int column = index.column();
注意:上面代码要放在button对应的槽函数中。在某些情况下,不能把button控件直接放到QTableWidget中,这个时候需要添加QWidget设置为button控件的父类,通过添加widget,再将button添加到tableWidget中。如果是这样的话,上面获取button所在行列的方法就不能使用了。那该如何做呢?其实很简单,只需要将button的位置替换为它的父类QWidget即可:
QPushButton *obj = (QPushButton*)sender();
QWidget *_widget = obj->parentWidget();
int x = _widget->frameGeometry().x();
int y = _widget->frameGeometry().y();
1.2 插入QComboBox、QLineEdit等控件
QTableWidget中如果插入QComboBox、QLineEdit等控件,如果不想这一列被选中,可以加入如下代码,然后再加入对应的控件:
cell = new QTableWidgetItem();
cell->setTextAlignment(Qt::AlignCenter);
cell->setFlags(cell->flags() ^ Qt::ItemIsEditable);
cell->setFlags(cell->flags() & ~Qt::ItemIsSelectable);
ui.tableWidget->setItem(1 + i * 2, 2,cell);
QWidget *_widgetUpDown = new QWidget(ui.tableWidget);
QHBoxLayout *_hlayoutUpDown = new QHBoxLayout;
_hlayoutUpDown->setMargin(0);
MyLineEdit *_lineEditUpDown = new MyLineEdit();
_lineEditUpDown->setValidator(m_pRevalidotor);
_lineEditUpDown->setAlignment(Qt::AlignCenter);
_lineEditUpDown->setText(_schedule->getRunNextTime()); //获取数据
_lineEditUpDown->setFixedSize(70, 25);
connect(_lineEditUpDown, SIGNAL(textEdited(const QString &)), this, SLOT(slotChangeRunTime(const QString &)));
2. 删除QTableWidget中的行
2.1 删除所有行
ui.tableWidget->setRowCount(0);
ui.tableWidget->clearContents();
注意:并不是直接使用clear()函数,使用clear()的话,表头内容也会删除。
2.2 删除选中行
QList<QTableWidgetSelectionRange> _ranges = ui.tableWidget->selectedRanges();
int _selectRows = _ranges.count();
for (int j = 0; j < _selectRows; j++)
{
int _topRow = _ranges.at(j).topRow(); //获取所在行
ui.tableWidget->remove(_topRow);
}
2.3 删除选中多行
std::vector<int> _vecItemIndex; //保存选中行的行号
QList<QTableWidgetItem*> _selections = ui.tableWidget->selectedItems();
for (int i = 0; i < _selections.size(); ++i)
{
_vecItemIndex.push_back(_selections.at(i)->row()); //存储选中的行
}
std::sort(_vecItemIndex.begin(), _vecItemIndex.end(), std::greater<int>()); //将行号从大到小排序
_vecItemIndex.erase(std::unique(_vecItemIndex.begin(), _vecItemIndex.end()), _vecItemIndex.end()); //去除重复的行号
for (int k = 0; k < _vecItemIndex.size(); ++k)
{
QString _name = ui.tableWidget->item(_vecItemIndex[k], 0)->text();
//..删除数据部分
m_ui.tableWidget_4->removeRow(_vecItemIndex[k]);
}
3. QTableWidgetItem绑定指针数据
Printer *_printer = new Printer;
QTableWidgetItem *cell = new QTableWidgetItem(ui.tableWidget);
cell->setData(Qt::UserRole, (unsigned int)_printer);
获取绑定的数据:
Printer *getData = (Printer *)(ui.tableWidget->item(row, column)->data(Qt::UserRole).toUInt());
4. QTableWidget基本设置
4.1 基本属性设置
ui.tableWidget->setFocusPolicy(Qt::NoFocus); //选中时不出现虚线框
ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //选择时以行为单位
ui.tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //只能进行单选
ui.tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); //设置多选
ui.tableWidget->setColumnHidden(0, true); //隐藏某一列
ui.tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); //Interactive,Fixed,Stretch,ResizeToContents,设置自适应大小
4.2 常用信号槽事件
connect(ui.tableWidget, &QTableWidget::cellDoubleClicked, this, &MyClass::onCellDoubleClicked); //响应双击事件
4.3 避坑设置
ui.tableWidget->setRowCount(4);
之前写了一堆QTableWidgetItem,发现格式也没错,为啥不显示数据呢?查了约有十来分钟,才意识到是没有进行行的设置。这也是使用QTableWidget需要注意的地方。