1.QTableWidget继承自QTableView。
QSqlTableModel能与QTableView绑定,但不能于QTableWidget绑定。 QTableWidget是QTableView的子类,主要的区别是QTableView可以使用自定义的数据模型来显示内容(也就是先要通过setModel来绑定数据源),而QTableWidget则只能使用标准的数据模型,并且其单元格数据是QTableWidgetItem的对象来实现的(也就是不需要数据源,将逐个单元格内的信息填好即可)。这主要体现在QTableView类中有setModel成员函数,而到了QTableWidget类中,该成员函数变成了私有。使用QTableWidget就离不开QTableWidgetItem。QTableWidgetItem用来表示表格中的一个单元格,正个表格都需要用逐个单元格构建起来。
QTableWidget和QTableView区别见:https://blog.csdn.net/zyc_csdn/article/details/78830542
tbl_task_list=new QTableWidget(this); tbl_task_list->setMinimumHeight (150); tbl_task_list->setMaximumWidth (500); tbl_task_list->setColumnCount(5); tbl_task_list->verticalHeader()->setVisible(false); tbl_task_list->horizontalHeader()->setVisible(true); tbl_task_list->setShowGrid(true); //设置显示格子线 tbl_task_list->setEditTriggers(QAbstractItemView::NoEditTriggers); tbl_task_list->setSelectionBehavior(QAbstractItemView::SelectRows); tbl_task_list->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); QStringList header_task; header_task<<"任务名称"<<"小车"<<"任务状态"<<"任务产生时间"<<"任务相应时间"; tbl_task_list->setHorizontalHeaderLabels(header_task); tbl_task_list->setObjectName("tbl_task_list"); /* //添加一行数据 rows=tbl_task_list->rowCount ()+1; tbl_task_list->setRowCount (rows); addTaskItem("111",rows-1,0); addTaskItem("222",rows-1,1); addTaskItem("333",rows-1,2); addTaskItem("444",rows-1,3); addTaskItem("555",rows-1,4); //添加一行数据 rows=tbl_task_list->rowCount ()+1; tbl_task_list->setRowCount (rows); addTaskItem("aaa",rows-1,0); addTaskItem("bbb",rows-1,1); addTaskItem("cccc",rows-1,2); addTaskItem("dddd",rows-1,3); addTaskItem("eeee",rows-1,4);
void Widget::addTaskItem(QString data,int row ,int col) { QTableWidgetItem *item = new QTableWidgetItem(data); QFont font; font.setFamily ("Verdana"); font.setBold (false); font.setPixelSize (12); item->setFont(font); item->setTextAlignment (Qt::AlignCenter); tbl_task_list->setItem(row,col,item); }
2. 隐藏列表头和行表头,#include <QHeaderView>
tbMotorWidget->verticalHeader()->setVisible(false); //隐藏列表头 tbMotorWidget->horizontalHeader()->setVisible(false); //隐藏行表头
隐藏列 tw->setColumnHidden(0,true);
取隐藏列值tw->item(row,0)->text();
可以用来取数据库的id值,更新数据和删除数据很有用。
3. 设置表头的背景色
tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:#00BFFF;}");
4. 隐藏滚动条
twInfo->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff);
twInfo->setVerticalScrollBarPolicy (Qt::ScrollBarAlwaysOff);
5. 设置垂直头不可见,即左边序号不见
tableWidget->verticalHeader()->setVisible(true);//显示行序号1,2,3...
6. 每添加一条数据滚动条自动到底
tableWidget->scrollToBottom();
7. 文本居中显示
QTableWidgetItem *item = new QTableWidgetItem(data); QFont font; font.setFamily ("Verdana"); font.setBold (false); font.setPixelSize (12); item->setFont(font); item->setTextAlignment (Qt::AlignCenter); return item;
8. 指定表头字体
QFont font; font.setBold(true); tableWidget->horizontalHeader()->setFont(font);
9. 设置表头的内容充满整个表格的宽度
tableWidget->horizontalHeader()->setStretchLastSection(true);
10. 选择行
tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //设置选择行为时每次一行
tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); //可多选(Ctrl、Shift、Ctrl+A都可以)
11.QTableWidget使用setCellWidget设置控件默认是塞满填充的,如果强制设置了控件的尺寸,则默认左上角开始放置,有时候这种情况很难看,需要居中显示,QTableWidget可以设置文本居中显示,但是不能设置控件居中显示。使用如下方法可以实现:
if(tbDataWidget->rowCount()==0) { tbDataWidget->setRowCount(5); for(int i=0;i<5;i++) { addTableCheckItem(i); QPushButton *btnColor=new QPushButton(this); btnColor->setMinimumSize(15,15); btnColor->setMaximumSize(15,15); setButtonColor(btnColor,getRandomColor()); QWidget *btnWidget = new QWidget; QHBoxLayout *hLayout = new QHBoxLayout(this); hLayout->setSpacing(0); hLayout->setMargin(0); hLayout->addWidget(btnColor); btnWidget->setLayout(hLayout); tbDataWidget->setCellWidget(i,0,btnWidget); connect(btnColor,&QPushButton::clicked,[=](){ slotColorButtonClicked(i); }); } }
void OperationWidget::slotColorButtonClicked(int row) { QWidget *widget = (QWidget *)tbDataWidget->cellWidget(row, 0); QPushButton *btn = (QPushButton *)widget->children().at(1); QColor c = QColorDialog::getColor(Qt::blue); setButtonColor(btn,c); }
void OperationWidget::setButtonColor(QPushButton *btn, QColor c) { btn->setStyleSheet("background-color:rgb("+QString::number(c.red())+"," +QString::number(c.green())+"," +QString::number(c.blue())+");"); }
12.点击单元格触发事件
connect(tbDataWidget,SIGNAL(cellClicked(int,int)),this,SLOT(slotTableItemSelected(int,int)));
void OperationWidget::slotTableItemSelected(int row, int col) { if(tbDataWidget->item(row,3)->checkState()==Qt::Checked) { emit sigShowSelectedValue(true,tbDataWidget->item(row,0)->text()); } else { emit sigShowSelectedValue(false,tbDataWidget->item(row,0)->text()); } }
13. 清除
tableWidget->clear();//清除所有可见数据(包括表头),行还在 tableWidget->clearContents();//只清除表中数据,不清除表头内容 tableWidget->setRowCount(0);//连行也清除掉
14. 添加控件,获得控件触发的行
QSlider *slider=new QSlider(this); slider->setOrientation(Qt::Horizontal); slider->setMinimum(1100); slider->setMaximum(1900); slider->setSingleStep(1); connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slotSilderValueChange(int))); tbMotorWidget->setCellWidget(i,3,slider);
void OperationWidget::slotSilderValueChange(int value) { QSlider *senderObj=qobject_cast<QSlider*>(sender()); if(senderObj == nullptr) { return; } QModelIndex idx =tbMotorWidget->indexAt(QPoint(senderObj->frameGeometry().x(),senderObj->frameGeometry().y())); int row=idx.row(); qDebug()<<"row"<<row; }
15. 某一列禁止编辑
QTableWidgetItem *item = new QTableWidgetItem(data); if(!isIsEditable) { item->setFlags(item->flags() & (~Qt::ItemIsEditable)); }
16.设置某一列宽度
tableWidget->setColumnWidth(0, 30);'
17.平均分配剩余的空白
tw->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
tw->horizontalHeader()->setSectionsClickable(false);