设置表头:
- void port::on_setTableHead_clicked()
- {
- QTableWidgetItem* headerItem;
- QStringList headerText;
- headerText << QStringLiteral("姓名") << QStringLiteral("性别") << QStringLiteral("出生日期") << QStringLiteral("民族") << QStringLiteral("分数") << QStringLiteral("是否党员");
- ui.tableWidget->setColumnCount(headerText.count());
- for (int i = 0; i < ui.tableWidget->columnCount(); i++)
- {
- headerItem = new QTableWidgetItem(headerText.at(i));
- QFont font = headerItem->font();
- font.setBold(true);
- font.setPointSize(12);
- headerItem->setTextColor(Qt::red);
- headerItem->setFont(font);
- ui.tableWidget->setHorizontalHeaderItem(i,headerItem);
- }
- }
设置委托:
委托需要继承QItemDelegate,并重载createEditor、setEditorData、setModelData、updateEditorGeometry四个方法。
- class QTableDelegate:public QItemDelegate
- {
- Q_OBJECT
- public:
- QTableDelegate(QObject* parent = 0);
- QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem &option,
- const QModelIndex &index) const Q_DECL_OVERRIDE;
- void setEditorData(QWidget* editor, const QModelIndex &index) const Q_DECL_OVERRIDE;
- void setModelData(QWidget* editor, QAbstractItemModel* model,
- const QModelIndex &index) const Q_DECL_OVERRIDE;
- void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem &option,
- const QModelIndex &index) const Q_DECL_OVERRIDE;
- };
- #include "QTableDelegate.h"
- #include
-
- QTableDelegate::QTableDelegate(QObject* parent):QItemDelegate(parent)
- {
- }
-
- QWidget* QTableDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem &option,
- const QModelIndex &index) const
- {
- QSpinBox* editor = new QSpinBox(parent);
- editor->setFrame(false);
- editor->setMinimum(0);
- editor->setMaximum(10000);
- return editor;
- }
-
- void QTableDelegate::setEditorData(QWidget* editor, const QModelIndex &index) const
- {
- int value = index.model()->data(index, Qt::EditRole).toInt();
- QSpinBox* spinBox = static_cast
(editor); - spinBox->setValue(value);
- }
-
- void QTableDelegate::setModelData(QWidget* editor, QAbstractItemModel* model,
- const QModelIndex &index) const
- {
- QSpinBox* spinBox = static_cast
(editor); - spinBox->interpretText();
- int value = spinBox->value();
- model->setData(index, value, Qt::EditRole);
- }
-
- void QTableDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem &option,
- const QModelIndex &index) const
- {
- editor->setGeometry(option.rect);
- }
设置行数:
ui.tableWidget->setRowCount(ui.rowCount->value());
设置交替行背景颜色:
ui.tableWidget->setAlternatingRowColors(ui.bottomColor->isChecked());
设置文本对齐格式:
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
新建一行所有项:
- //为一行的单元格创建 Items
- QTableWidgetItem *item;
- QString str;
- uint StudID=201605000; //学号基数
-
- //姓名
- //新建一个Item,设置单元格type为自定义的MainWindow::ctName
- item=new QTableWidgetItem(Name,MainWindow::ctName);
- item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐格式
- StudID +=rowNo; //学号=基数+ 行号
- item->setData(Qt::UserRole,QVariant(StudID)); //设置studID为data
- ui->tableInfo->setItem(rowNo,MainWindow::colName,item); //为单元格设置Item
-
- //性别
- QIcon icon;
- if (Sex=="男")
- icon.addFile(":/images/icons/boy.ico");
- else
- icon.addFile(":/images/icons/girl.ico");
- item=new QTableWidgetItem(Sex,MainWindow::ctSex); //新建一个Item,设置单元格type为自定义的 MainWindow::ctSex
- item->setIcon(icon);
- item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//为单元格设置Item
- ui->tableInfo->setItem(rowNo,MainWindow::colSex,item);//为单元格设置Item
-
- //出生日期
- str=birth.toString("yyyy-MM-dd"); //日期转换为字符串
- item=new QTableWidgetItem(str,MainWindow::ctBirth);//新建一个Item,设置单元格type为自定义的 MainWindow::ctBirth
- item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); //文本对齐格式
- ui->tableInfo->setItem(rowNo,MainWindow::colBirth,item);//为单元格设置Item
-
- //民族
- item=new QTableWidgetItem(Nation,MainWindow::ctNation); //新建一个Item,设置单元格type为自定义的 MainWindow::ctNation
- item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文本对齐格式
- ui->tableInfo->setItem(rowNo,MainWindow::colNation,item);//为单元格设置Item
-
- //是否党员
- item=new QTableWidgetItem("党员",MainWindow::ctPartyM);//新建一个Item,设置单元格type为自定义的 MainWindow::ctPartyM
- item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文本对齐格式
- if (isPM)
- item->setCheckState(Qt::Checked);
- else
- item->setCheckState(Qt::Unchecked);
- item->setBackgroundColor(Qt::yellow);//Qt::green lightGray yellow
- ui->tableInfo->setItem(rowNo,MainWindow::colPartyM,item);//为单元格设置Item
-
- //分数
- str.setNum(score);
- item=new QTableWidgetItem(str,MainWindow::ctScore);//新建一个Item,设置单元格type为自定义的 MainWindow::ctPartyM
- item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文本对齐格式
- ui->tableInfo->setItem(rowNo,MainWindow::colScore,item);//为单元格设置Item
设置是否可选、设置背景色:
- item = new QTableWidgetItem(QStringLiteral("党员"),port::ctPartyM);
- item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
- if (isPM)
- item->setCheckState(Qt::Checked);
- else
- item->setCheckState(Qt::Unchecked);
- item->setBackgroundColor(Qt::yellow);
- ui.tableWidget->setItem(rowNo,port::colPartyM,item);
插入行:
- void MainWindow::on_btnAppendRow_clicked()
- { //添加一行
- int curRow=ui->tableInfo->rowCount();//当前行号
- ui->tableInfo->insertRow(curRow);//在表格尾部添加一行
- createItemsARow(curRow, "新生", "女",
- QDate::fromString("2000-1-1","yyyy-M-d"),"满族",false,50 ); //为某一行创建items
- }
增加行:
- void MainWindow::on_btnAppendRow_clicked()
- { //添加一行
- int curRow=ui->tableInfo->rowCount();//当前行号
- ui->tableInfo->insertRow(curRow);//在表格尾部添加一行
- createItemsARow(curRow, "新生", "女",
- QDate::fromString("2000-1-1","yyyy-M-d"),"满族",false,50 ); //为某一行创建items
- }
删除行:
- void MainWindow::on_btnDelCurRow_clicked()
- {//删除当前行及其items
- int curRow=ui->tableInfo->currentRow();//当前行号
- ui->tableInfo->removeRow(curRow); //删除当前行及其items
- }
表格是否可编辑:
- void port::on_setTableEditable_clicked(bool checked)
- {
- if (checked)
- ui.tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);
- else
- ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
- }
设置是否显示行列表头:
- void port::on_showRowHead_clicked(bool checked)
- {
- ui.tableWidget->horizontalHeader()->setVisible(checked);
- }
-
- void port::on_showColHead_clicked(bool checked)
- {
- ui.tableWidget->verticalHeader()->setVisible(checked);
- }
设置点击是选择行还是选择单元格:
- void port::on_rowSelect_clicked()
- {
- ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
- }
-
- void port::on_unitSelect_clicked()
- {
- ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);
- }
读取表格内容到文本编辑器:
- void port::on_readTable_clicked()
- {
- QString str;
- QTableWidgetItem* cellItem;
- ui.plainTextEdit->clear();
- for (int i = 0; i < ui.tableWidget->rowCount(); i++)
- {
- str = QString::asprintf("第%d行:",i+1);
- for (int j = 0; j < ui.tableWidget->columnCount() - 1 ; j++)
- {
- cellItem = ui.tableWidget->item(i,j);
- str = str + cellItem->text() + " ";
- }
- cellItem = ui.tableWidget->item(i,colPartyM);
- if (cellItem->checkState() == Qt::Checked)
- str = str + "党员";
- else
- str = str + "群众";
- ui.plainTextEdit->appendPlainText(str);
- }
- }
自动调整行高和列宽:
- void port::on_judgeHeight_clicked()
- {
- ui.tableWidget->resizeRowsToContents();
- }
-
- void port::on_judgeWidth_clicked()
- {
- ui.tableWidget->resizeColumnsToContents();
- }
设置某个单元格不可编辑:
- 要设置QTableWidget的特定单元格不可编辑,可以使用setItem()方法在该单元格上设置一个只读的QTableWidgetItem。以下是一个示例代码:
-
- ```cpp
- // 创建QTableWidget和单元格项
- QTableWidget* tableWidget = new QTableWidget(3, 3);
- QTableWidgetItem* item1 = new QTableWidgetItem("Item 1");
- QTableWidgetItem* item2 = new QTableWidgetItem("Item 2");
- QTableWidgetItem* item3 = new QTableWidgetItem("Item 3");
-
- // 将单元格项添加到表格中
- tableWidget->setItem(0, 0, item1);
- tableWidget->setItem(0, 1, item2);
- tableWidget->setItem(0, 2, item3);
-
- // 设置第一个单元格为只读
- item1->setFlags(item1->flags() & ~Qt::ItemIsEditable);
- ```
-
- 在上面的代码中,我们创建了一个3x3的QTableWidget,然后创建了三个QTableWidgetItem并将它们添加到表格中的相应位置。最后,我们将第一个单元格项的标志设置为不可编辑,通过将ItemIsEditable标志从其原始标志中移除。
-
- 这样,第一个单元格就被设置为不可编辑,而其他单元格仍然可以编辑。
单元格某行某列变了:
- 要通过信号与槽机制找到QTableWidget中哪行哪列的单元格发生了变化并获取变化后的值,可以使用QTableWidget的cellChanged()信号和相关的槽函数。cellChanged()信号在单元格的内容发生变化时触发。
-
- 以下是一个示例代码:
-
- ```cpp
- // 创建QTableWidget并设置行列数
- QTableWidget* tableWidget = new QTableWidget(3, 3);
-
- // 连接cellChanged()信号到槽函数
- connect(tableWidget, &QTableWidget::cellChanged, this, &MainWindow::onCellChanged);
-
- // 槽函数
- void MainWindow::onCellChanged(int row, int column)
- {
- // 获取变化后的值
- QTableWidgetItem* item = tableWidget->item(row, column);
- QString newValue = item->text();
-
- // 输出变化的行列和新值
- qDebug() << "Cell at row" << row << "column" << column << "changed to" << newValue;
- }
- ```
-
- 在上面的代码中,我们首先创建了一个3x3的QTableWidget,并将其cellChanged()信号连接到了槽函数onCellChanged()。当单元格发生变化时,onCellChanged()槽函数将被调用。
-
- 在槽函数中,我们首先通过传递的row和column参数获取变化的单元格的QTableWidgetItem。然后,我们可以使用QTableWidgetItem的text()方法获取变化后的值。
-
- 最后,我们通过qDebug输出变化的行列和新值。你可以根据需要在onCellChanged()槽函数中执行其他操作,比如更新数据模型或做其他处理。