Qt中QTableWidget的常用功能

目录

1. 在QTableWidget中插入QWiget

1.1 插入QPushButtton,并响应Button事件

1.2 插入QComboBox、QLineEdit等控件

2. 删除QTableWidget中的行

2.1 删除所有行

2.2 删除选中行

2.3 删除选中多行

3. QTableWidgetItem绑定指针数据

4. QTableWidget基本设置

4.1 基本属性设置

4.2 常用信号槽事件 


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 插入QComboBoxQLineEdit等控件

QTableWidget中如果插入QComboBoxQLineEdit等控件,如果不想这一列被选中,可以加入如下代码,然后再加入对应的控件: 

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需要注意的地方。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值