// ============================================================================ // qt_table_widget_basics —— 教学补充示例:QTableWidget 表格与单元格事件 // 对应教案:OUTLINE_4DAY.md Day4 上午「表格」环节(新安排原文「表格事件」) // 配套文档:docs/teaching/examples/table_widget/README.md // 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_table_widget_basics // // QTableWidget 是「item 类」控件:数据直接塞进控件里(QTableWidgetItem), // 上手快、够中小项目用;数据/展示彻底分离的完整 Model/View 架构见 // ../model_view/qt_model_view_basics.cpp(延伸钩子)。 // ============================================================================ #include #include #include #include #include #include #include class TableDemo : public QWidget { Q_OBJECT public: explicit TableDemo(QWidget* parent = nullptr) : QWidget(parent) { m_table = new QTableWidget(3, 3, this); // 行列数在构造时给定 m_table->setHorizontalHeaderLabels( {QStringLiteral("姓名"), QStringLiteral("成绩"), QStringLiteral("标签")}); m_table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); const char* names[] = {"张三", "李四", "王五"}; const char* scores[] = {"91.5", "88", "76"}; const char* tags[] = {"组长", "美工", "测试"}; for (int row = 0; row < 3; ++row) { // 每个单元格一个 QTableWidgetItem,new 出来交给表格接管所有权 m_table->setItem(row, 0, new QTableWidgetItem(QString::fromUtf8(names[row]))); m_table->setItem(row, 1, new QTableWidgetItem(QString::fromUtf8(scores[row]))); m_table->setItem(row, 2, new QTableWidgetItem(QString::fromUtf8(tags[row]))); } m_status = new QLabel(QStringLiteral("点击任意单元格试试"), this); auto* layout = new QVBoxLayout(this); layout->addWidget(m_table); layout->addWidget(m_status); // 「表格事件」以信号形式暴露:cellClicked / cellDoubleClicked / // itemChanged(编辑单元格后触发)…… 不需要重写 event 函数。 connect(m_table, &QTableWidget::cellClicked, this, &TableDemo::onCellClicked); connect(m_table, &QTableWidget::itemChanged, this, [this](QTableWidgetItem* item) { m_status->setText(QStringLiteral("(%1,%2) 被改为 %3") .arg(item->row()).arg(item->column()).arg(item->text())); }); } private slots: void onCellClicked(int row, int column) { QTableWidgetItem* item = m_table->item(row, column); m_status->setText(QStringLiteral("点击了 (%1,%2):%3") .arg(row).arg(column) .arg(item ? item->text() : QStringLiteral("<空>"))); } private: QTableWidget* m_table = nullptr; QLabel* m_status = nullptr; }; int main(int argc, char* argv[]) { QApplication app(argc, argv); TableDemo demo; demo.setWindowTitle(QStringLiteral("QTableWidget 基础")); demo.resize(420, 240); demo.show(); if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { QTimer::singleShot(200, &app, &QApplication::quit); } return app.exec(); } #include "qt_table_widget_basics.moc"