| 类别 | 功能 | API / 方法 | 代码示例 |
|---|
| 初始化 | 创建数据模型 | new QStandardItemModel(this) | model = new QStandardItemModel(this); |
| 初始化 | 绑定模型到视图 | tableView->setModel(model) | ui->tableView->setModel(model); |
| 初始化 | 设置不可编辑 | setEditTriggers(QAbstractItemView::NoEditTriggers) | ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); |
| 表头 | 设置水平表头项 | model->setHorizontalHeaderItem(int, QStandardItem*) | model->setHorizontalHeaderItem(i, new QStandardItem(QString::fromLocal8Bit(t))); |
| 表头 | 列宽自动拉伸 | horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch) | ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); |
| 单元格写入 | 设置单元格数据项 | model->setItem(int row, int col, QStandardItem*) | model->setItem(index, columnCount-1, item); |
| 单元格写入 | 设置项前景色 | item->setForeground(QBrush) | item->setForeground(QBrush(QColor(255, 0, 0))); |
| 单元格写入 | 设置项字体 | item->setFont(QFont) | item->setFont(tableFont); |
| 数据读取 | 获取总行数 | model->rowCount() | int row = model->rowCount(); |
| 数据读取 | 获取总列数 | model->columnCount() | auto col = model->columnCount()-2; |
| 数据读取 | 通过视图获取模型列数 | tableView->model()->columnCount() | auto columnCount = ui->tableView->model()->columnCount(); |
| 数据读取 | 获取单元格 item | model->item(int row, int col) | if (model->item(i,j)) |
| 数据读取 | 读取 item 文本 | item->text() | rowItemsText.append(model->item(i, j)->text()); |
| 视图操作 | 滚动到底部 | tableView->scrollToBottom() | ui->tableView->scrollToBottom(); |
| 清空 | 清空模型所有数据 | model->clear() | model->clear(); |
说明
- 代码使用的是
QTableView+QStandardItemModel的组合(不同于同文件中ui->tableWidget用的是QTableWidget,后者自带数据模型)。 model在构造函数中创建并绑定到ui->tableView,是整个右下角测量结果表格的数据源。- 单元格颜色(红=NG/超限,绿=OK)通过
QStandardItem::setForeground实现,字体粗体通过setFont(tableFont)实现(tableFont在构造函数中设置为 11 号粗体)。 - 表头数据来自
dog/*.json配置文件中的list字段,见combboxChangedSlot函数。 - "清零"按钮 (
on_pushButton_4_clicked) 和切换型号下拉框都会调用model->clear()清空表格。
fromPyQt5.QtWidgetsimport*fromPyQt5.QtGuiimport*fromPyQt5.QtCoreimport*importsysclassTable(QWidget):def__init__(self,arg=None):super(Table,self).__init__(arg)self.setWindowTitle("QTableView表格视图控件的例子")self.resize(500,300);self.model=QStandardItemModel(4,4);self.model.setHorizontalHeaderLabels(['标题1','标题2','标题3','标题4'])forrowinrange(4):forcolumninrange(4):item=QStandardItem("row %s, column %s"%(row,column))self.model.setItem(row,column,item)self.tableView=QTableView()self.tableView.setModel(self.model)#下面代码让表格100填满窗口self.tableView.horizontalHeader().setStretchLastSection(True)self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)dlgLayout=QVBoxLayout();dlgLayout.addWidget(self.tableView)self.setLayout(dlgLayout)if__name__=='__main__':app=QApplication(sys.argv)table=Table()table.show()sys.exit(app.exec_())
importsysfromPyQt5.QtWidgetsimport(QApplication,QWidget,QVBoxLayout,QTableView,QAbstractItemView,QHeaderView,QPushButton)fromPyQt5.QtGuiimportQStandardItemModel,QStandardItem,QBrush,QColor,QFontfromPyQt5.QtCoreimportQTimerclassMainWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle("QTableView 每秒追加一行模拟实时测量")self.resize(1100,550)layout=QVBoxLayout(self)self.btn_start=QPushButton("开始模拟追加数据")self.btn_stop=QPushButton("停止")layout.addWidget(self.btn_start)layout.addWidget(self.btn_stop)self.tableView=QTableView()layout.addWidget(self.tableView)self.model=QStandardItemModel(self)self.tableView.setModel(self.model)self.tableView.setEditTriggers(QAbstractItemView.NoEditTriggers)self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)# 设置表头(只初始化一次)self.init_header()# 原始数据源self.rows_data=[["263.859","234.687","7.886","20.167","9.00514","5.927","7.8900","NG","-"],["263.999","234.857","7.895","20.186","8.95640","5.934","7.8900","OK","OK"],["263.883","234.734","7.886","20.141","9.00873","5.936","7.8766","NG","-"],["263.862","234.728","7.883","20.118","9.01633","5.921","7.8900","OK","OK"],["263.986","234.860","7.876","20.123","9.00313","5.940","7.8898","OK","OK"],["263.797","234.648","7.873","20.122","9.02591","5.908","7.8900","OK","OK"],["263.891","234.797","7.885","20.128","8.96693","5.944","7.8746","NG","-"],]self.data_index=0# 当前取到第几行,循环游标self.bold_font=QFont()self.bold_font.setBold(True)# 定时器 1000msself.timer=QTimer(self)self.timer.setInterval(1000)self.timer.timeout.connect(self.append_one_row)self.btn_start.clicked.connect(self.timer.start)self.btn_stop.clicked.connect(self.timer.stop)definit_header(self):"""只初始化一次表头"""header_list=["全长","行程","螺纹直径","螺纹长度","螺纹长度","螺纹直径","外径","尺寸结果","表检结果"]forcol,textinenumerate(header_list):h_item=QStandardItem(text)self.model.setHorizontalHeaderItem(col,h_item)defappend_one_row(self):"""定时器回调:追加一行"""# 取当前一行数据,游标循环one_row=self.rows_data[self.data_index]self.data_index+=1ifself.data_index>=len(self.rows_data):self.data_index=0new_row=self.model.rowCount()# 在最后插入空行self.model.insertRow(new_row)forcol_idx,txtinenumerate(one_row):item=QStandardItem(txt)iftxt=="NG":item.setForeground(QBrush(QColor(255,0,0)))item.setFont(self.bold_font)self.model.setItem(new_row,col_idx,item)# 新增完成自动滚动到底部,看最新数据self.tableView.scrollToBottom()if__name__=="__main__":app=QApplication(sys.argv)win=MainWindow()win.show()sys.exit(app.exec_())
![]()