• QTableWidget相关操作


    设置表头:

    1. void port::on_setTableHead_clicked()
    2. {
    3. QTableWidgetItem* headerItem;
    4. QStringList headerText;
    5. headerText << QStringLiteral("姓名") << QStringLiteral("性别") << QStringLiteral("出生日期") << QStringLiteral("民族") << QStringLiteral("分数") << QStringLiteral("是否党员");
    6. ui.tableWidget->setColumnCount(headerText.count());
    7. for (int i = 0; i < ui.tableWidget->columnCount(); i++)
    8. {
    9. headerItem = new QTableWidgetItem(headerText.at(i));
    10. QFont font = headerItem->font();
    11. font.setBold(true);
    12. font.setPointSize(12);
    13. headerItem->setTextColor(Qt::red);
    14. headerItem->setFont(font);
    15. ui.tableWidget->setHorizontalHeaderItem(i,headerItem);
    16. }
    17. }

    设置委托:

    委托需要继承QItemDelegate,并重载createEditor、setEditorData、setModelData、updateEditorGeometry四个方法。

    1. class QTableDelegate:public QItemDelegate
    2. {
    3. Q_OBJECT
    4. public:
    5. QTableDelegate(QObject* parent = 0);
    6. QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem &option,
    7. const QModelIndex &index) const Q_DECL_OVERRIDE;
    8. void setEditorData(QWidget* editor, const QModelIndex &index) const Q_DECL_OVERRIDE;
    9. void setModelData(QWidget* editor, QAbstractItemModel* model,
    10. const QModelIndex &index) const Q_DECL_OVERRIDE;
    11. void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem &option,
    12. const QModelIndex &index) const Q_DECL_OVERRIDE;
    13. };
    1. #include "QTableDelegate.h"
    2. #include
    3. QTableDelegate::QTableDelegate(QObject* parent):QItemDelegate(parent)
    4. {
    5. }
    6. QWidget* QTableDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem &option,
    7. const QModelIndex &index) const
    8. {
    9. QSpinBox* editor = new QSpinBox(parent);
    10. editor->setFrame(false);
    11. editor->setMinimum(0);
    12. editor->setMaximum(10000);
    13. return editor;
    14. }
    15. void QTableDelegate::setEditorData(QWidget* editor, const QModelIndex &index) const
    16. {
    17. int value = index.model()->data(index, Qt::EditRole).toInt();
    18. QSpinBox* spinBox = static_cast(editor);
    19. spinBox->setValue(value);
    20. }
    21. void QTableDelegate::setModelData(QWidget* editor, QAbstractItemModel* model,
    22. const QModelIndex &index) const
    23. {
    24. QSpinBox* spinBox = static_cast(editor);
    25. spinBox->interpretText();
    26. int value = spinBox->value();
    27. model->setData(index, value, Qt::EditRole);
    28. }
    29. void QTableDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem &option,
    30. const QModelIndex &index) const
    31. {
    32. editor->setGeometry(option.rect);
    33. }

    设置行数:

    ui.tableWidget->setRowCount(ui.rowCount->value());

    设置交替行背景颜色:

    ui.tableWidget->setAlternatingRowColors(ui.bottomColor->isChecked());
    设置文本对齐格式:
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);

    新建一行所有项:

    1. //为一行的单元格创建 Items
    2. QTableWidgetItem *item;
    3. QString str;
    4. uint StudID=201605000; //学号基数
    5. //姓名
    6. //新建一个Item,设置单元格type为自定义的MainWindow::ctName
    7. item=new QTableWidgetItem(Name,MainWindow::ctName);
    8. item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐格式
    9. StudID +=rowNo; //学号=基数+ 行号
    10. item->setData(Qt::UserRole,QVariant(StudID)); //设置studID为data
    11. ui->tableInfo->setItem(rowNo,MainWindow::colName,item); //为单元格设置Item
    12. //性别
    13. QIcon icon;
    14. if (Sex=="男")
    15. icon.addFile(":/images/icons/boy.ico");
    16. else
    17. icon.addFile(":/images/icons/girl.ico");
    18. item=new QTableWidgetItem(Sex,MainWindow::ctSex); //新建一个Item,设置单元格type为自定义的 MainWindow::ctSex
    19. item->setIcon(icon);
    20. item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//为单元格设置Item
    21. ui->tableInfo->setItem(rowNo,MainWindow::colSex,item);//为单元格设置Item
    22. //出生日期
    23. str=birth.toString("yyyy-MM-dd"); //日期转换为字符串
    24. item=new QTableWidgetItem(str,MainWindow::ctBirth);//新建一个Item,设置单元格type为自定义的 MainWindow::ctBirth
    25. item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); //文本对齐格式
    26. ui->tableInfo->setItem(rowNo,MainWindow::colBirth,item);//为单元格设置Item
    27. //民族
    28. item=new QTableWidgetItem(Nation,MainWindow::ctNation); //新建一个Item,设置单元格type为自定义的 MainWindow::ctNation
    29. item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文本对齐格式
    30. ui->tableInfo->setItem(rowNo,MainWindow::colNation,item);//为单元格设置Item
    31. //是否党员
    32. item=new QTableWidgetItem("党员",MainWindow::ctPartyM);//新建一个Item,设置单元格type为自定义的 MainWindow::ctPartyM
    33. item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文本对齐格式
    34. if (isPM)
    35. item->setCheckState(Qt::Checked);
    36. else
    37. item->setCheckState(Qt::Unchecked);
    38. item->setBackgroundColor(Qt::yellow);//Qt::green lightGray yellow
    39. ui->tableInfo->setItem(rowNo,MainWindow::colPartyM,item);//为单元格设置Item
    40. //分数
    41. str.setNum(score);
    42. item=new QTableWidgetItem(str,MainWindow::ctScore);//新建一个Item,设置单元格type为自定义的 MainWindow::ctPartyM
    43. item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文本对齐格式
    44. ui->tableInfo->setItem(rowNo,MainWindow::colScore,item);//为单元格设置Item

    设置是否可选、设置背景色:

    1. item = new QTableWidgetItem(QStringLiteral("党员"),port::ctPartyM);
    2. item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    3. if (isPM)
    4. item->setCheckState(Qt::Checked);
    5. else
    6. item->setCheckState(Qt::Unchecked);
    7. item->setBackgroundColor(Qt::yellow);
    8. ui.tableWidget->setItem(rowNo,port::colPartyM,item);

    插入行:

    1. void MainWindow::on_btnAppendRow_clicked()
    2. { //添加一行
    3. int curRow=ui->tableInfo->rowCount();//当前行号
    4. ui->tableInfo->insertRow(curRow);//在表格尾部添加一行
    5. createItemsARow(curRow, "新生", "女",
    6. QDate::fromString("2000-1-1","yyyy-M-d"),"满族",false,50 ); //为某一行创建items
    7. }

    增加行:

    1. void MainWindow::on_btnAppendRow_clicked()
    2. { //添加一行
    3. int curRow=ui->tableInfo->rowCount();//当前行号
    4. ui->tableInfo->insertRow(curRow);//在表格尾部添加一行
    5. createItemsARow(curRow, "新生", "女",
    6. QDate::fromString("2000-1-1","yyyy-M-d"),"满族",false,50 ); //为某一行创建items
    7. }

    删除行

    1. void MainWindow::on_btnDelCurRow_clicked()
    2. {//删除当前行及其items
    3. int curRow=ui->tableInfo->currentRow();//当前行号
    4. ui->tableInfo->removeRow(curRow); //删除当前行及其items
    5. }

    表格是否可编辑:

    1. void port::on_setTableEditable_clicked(bool checked)
    2. {
    3. if (checked)
    4. ui.tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);
    5. else
    6. ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
    7. }

    设置是否显示行列表头:

    1. void port::on_showRowHead_clicked(bool checked)
    2. {
    3. ui.tableWidget->horizontalHeader()->setVisible(checked);
    4. }
    5. void port::on_showColHead_clicked(bool checked)
    6. {
    7. ui.tableWidget->verticalHeader()->setVisible(checked);
    8. }

    设置点击是选择行还是选择单元格:

    1. void port::on_rowSelect_clicked()
    2. {
    3. ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    4. }
    5. void port::on_unitSelect_clicked()
    6. {
    7. ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);
    8. }

    读取表格内容到文本编辑器

    1. void port::on_readTable_clicked()
    2. {
    3. QString str;
    4. QTableWidgetItem* cellItem;
    5. ui.plainTextEdit->clear();
    6. for (int i = 0; i < ui.tableWidget->rowCount(); i++)
    7. {
    8. str = QString::asprintf("第%d行:",i+1);
    9. for (int j = 0; j < ui.tableWidget->columnCount() - 1 ; j++)
    10. {
    11. cellItem = ui.tableWidget->item(i,j);
    12. str = str + cellItem->text() + " ";
    13. }
    14. cellItem = ui.tableWidget->item(i,colPartyM);
    15. if (cellItem->checkState() == Qt::Checked)
    16. str = str + "党员";
    17. else
    18. str = str + "群众";
    19. ui.plainTextEdit->appendPlainText(str);
    20. }
    21. }

    自动调整行高和列宽:

    1. void port::on_judgeHeight_clicked()
    2. {
    3. ui.tableWidget->resizeRowsToContents();
    4. }
    5. void port::on_judgeWidth_clicked()
    6. {
    7. ui.tableWidget->resizeColumnsToContents();
    8. }

    设置某个单元格不可编辑:

    1. 要设置QTableWidget的特定单元格不可编辑,可以使用setItem()方法在该单元格上设置一个只读的QTableWidgetItem。以下是一个示例代码:
    2. ```cpp
    3. // 创建QTableWidget和单元格项
    4. QTableWidget* tableWidget = new QTableWidget(3, 3);
    5. QTableWidgetItem* item1 = new QTableWidgetItem("Item 1");
    6. QTableWidgetItem* item2 = new QTableWidgetItem("Item 2");
    7. QTableWidgetItem* item3 = new QTableWidgetItem("Item 3");
    8. // 将单元格项添加到表格中
    9. tableWidget->setItem(0, 0, item1);
    10. tableWidget->setItem(0, 1, item2);
    11. tableWidget->setItem(0, 2, item3);
    12. // 设置第一个单元格为只读
    13. item1->setFlags(item1->flags() & ~Qt::ItemIsEditable);
    14. ```
    15. 在上面的代码中,我们创建了一个3x3的QTableWidget,然后创建了三个QTableWidgetItem并将它们添加到表格中的相应位置。最后,我们将第一个单元格项的标志设置为不可编辑,通过将ItemIsEditable标志从其原始标志中移除。
    16. 这样,第一个单元格就被设置为不可编辑,而其他单元格仍然可以编辑。

    单元格某行某列变了:

    1. 要通过信号与槽机制找到QTableWidget中哪行哪列的单元格发生了变化并获取变化后的值,可以使用QTableWidget的cellChanged()信号和相关的槽函数。cellChanged()信号在单元格的内容发生变化时触发。
    2. 以下是一个示例代码:
    3. ```cpp
    4. // 创建QTableWidget并设置行列数
    5. QTableWidget* tableWidget = new QTableWidget(3, 3);
    6. // 连接cellChanged()信号到槽函数
    7. connect(tableWidget, &QTableWidget::cellChanged, this, &MainWindow::onCellChanged);
    8. // 槽函数
    9. void MainWindow::onCellChanged(int row, int column)
    10. {
    11. // 获取变化后的值
    12. QTableWidgetItem* item = tableWidget->item(row, column);
    13. QString newValue = item->text();
    14. // 输出变化的行列和新值
    15. qDebug() << "Cell at row" << row << "column" << column << "changed to" << newValue;
    16. }
    17. ```
    18. 在上面的代码中,我们首先创建了一个3x3的QTableWidget,并将其cellChanged()信号连接到了槽函数onCellChanged()。当单元格发生变化时,onCellChanged()槽函数将被调用。
    19. 在槽函数中,我们首先通过传递的row和column参数获取变化的单元格的QTableWidgetItem。然后,我们可以使用QTableWidgetItem的text()方法获取变化后的值。
    20. 最后,我们通过qDebug输出变化的行列和新值。你可以根据需要在onCellChanged()槽函数中执行其他操作,比如更新数据模型或做其他处理。

  • 相关阅读:
    Nmap介绍与安装
    二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?
    AI推介-大语言模型LLMs论文速览(arXiv方向):2024.03.10-2024.03.15
    软考系列(系统架构师)- 2015年系统架构师软考案例分析考点
    vue和react的diff算法源码
    PointNet/Pointnet++训练及测试
    Java进阶(十四)单元测试、反射、注释、动态代理
    Java笔记(六)
    卫语句-前端应用
    开发说这个需求实现不了,怎么破?
  • 原文地址:https://blog.csdn.net/weixin_38241876/article/details/133928859