1. 程式人生 > >Qt下QTableWidget的使用

Qt下QTableWidget的使用

hid dcl 一次 sign rac ++ git xtend lang

本文主要內容:

  1. QTableWidget的基本設置
  2. 設置QTableWidget的某些字段不可編輯和背景顏色
  3. QTableWidget單元格的插入
  4. QTableWidget按字段值排序
  5. 在QTableWidget單元格中插入checkBox
  6. Demo代碼

1、QTableWidget的基本設置

ui->tableWidget->setColumnCount(11);
ui->tableWidget->setRowCount(NumOfReg);
/* 設置 tableWidget */
ui->tableWidget->setHorizontalHeaderLabels(QStringList() <<
"Id" << "Name" << "Unit" << "Value" << "Min" << "Max" \ << "Type" << "Mode" << "Enable" << "Last read" << "Last write"); ui->tableWidget->verticalHeader()->setVisible(false); // 隱藏水平header
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems); // 單個選中 ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); // 能夠選中多個

效果圖:
技術分享

2、設置QTableWidget的某些字段不可編輯和背景顏色

設置tableWidget下某些字段能夠編輯,某些字段不能夠編輯的方法:

void QTableWidget::setItem(int row, int column, QTableWidgetItem * item)

Sets the item for the given row and column to item.
技術分享
技術分享
來看一下Qt::ItemFlags有哪些類型:
技術分享
看到上面的幾個函數,就知道了能夠通過設置item。然後設置單元格的屬性。

每一個單元格都要擁有一個自己的item。不能共用。

設置QTableWidget的背景顏色:
能夠設置 QTableWidgetItem 的顏色:
技術分享
當然這裏你也能夠使用以下這個函數。但這在Qt5.4的文檔裏是不建議使用(deprecated)的:
技術分享

/* 設置 Id Name 字段的值不能改動 */
/* 設置不可改動的Id Name兩列的背景顏色為灰色 */
for(int i = 0; i < NumOfReg; i++) {
    QTableWidgetItem *item = new QTableWidgetItem();
    item->setBackground(QBrush(QColor(Qt::lightGray)));
    item->setFlags(item->flags() & (~Qt::ItemIsEditable));
    ui->tableWidget->setItem(i, 0, item);
}
for(int i = 0; i < NumOfReg; i++) {
    QTableWidgetItem *item = new QTableWidgetItem();
    item->setBackground(QBrush(QColor(Qt::lightGray)));
    item->setFlags(item->flags() & (~Qt::ItemIsEditable));
    ui->tableWidget->setItem(i, 1, item);
}

效果圖:
技術分享

3、QTableWidget單元格的插入

以下的代碼中,regInfo是指針數組。創建了5個RegisterInfo類的對象。並填充了默認字段。然後把這些字段值插入到對應的單元格中。

regInfo[0] = new RegisterInfo(0x00, QString("Target motor"), 255, 0, QString("U8"), QString("RW"), false);
regInfo[1] = new RegisterInfo(0x01, QString("Flags"), U32_MAX, 0, QString("U32"), QString("R"), false);
regInfo[2] = new RegisterInfo(0x02, QString("Status"), U8_MAX, 0, QString("U8"), QString("R"), false);
regInfo[3] = new RegisterInfo(0x03, QString("Control mode"), U8_MAX, 0, QString("U8"), QString("RW"), false);
regInfo[4] = new RegisterInfo(0x04, QString("Speed reference"), 4000, -4000, QString("S32"), QString("R"), false);

for(int i = 0; i < ui->tableWidget->rowCount(); i++) {
    ui->tableWidget->item(i, 0)->setText(QString::number(regInfo[i]->getId(), 10));
    ui->tableWidget->item(i, 1)->setText(regInfo[i]->getName());
}
for(int i = 0; i < ui->tableWidget->rowCount(); i++) {
    QTableWidgetItem *item_max = new QTableWidgetItem();
    item_max->setText(QString::number(regInfo[i]->getMax()));
    item_max->setBackground(QBrush(QColor(Qt::lightGray)));
    item_max->setFlags(item_max->flags() & (~Qt::ItemIsEditable));
    ui->tableWidget->setItem(i, 5, item_max);

    QTableWidgetItem *item_min = new QTableWidgetItem();
    item_min->setText(QString::number(regInfo[i]->getMin()));
    item_min->setBackground(QBrush(QColor(Qt::lightGray)));
    item_min->setFlags(item_min->flags() & (~Qt::ItemIsEditable));
    ui->tableWidget->setItem(i, 4, item_min);

    QTableWidgetItem *item_type = new QTableWidgetItem();
    item_type->setText(regInfo[i]->getType());
    item_type->setBackground(QBrush(QColor(Qt::lightGray)));
    item_type->setFlags(item_type->flags() & (~Qt::ItemIsEditable));
    ui->tableWidget->setItem(i, 6, item_type);

    QTableWidgetItem *item_mode = new QTableWidgetItem();
    item_mode->setText(regInfo[i]->getMode());
    item_mode->setBackground(QBrush(QColor(Qt::lightGray)));
    item_mode->setFlags(item_mode->flags() & (~Qt::ItemIsEditable));
    ui->tableWidget->setItem(i, 7, item_mode);
}

效果圖:
技術分享

4、QTableWidget按字段值排序

以下實現點擊每列的header。實現該列按字母順序升序或將序排列。
horizontalHeader() 函數是QTableWidget從QTableView繼承而來。它返回一個QHeaderView類型的指針。
技術分享
而QHeaderView有一個 sectionClicked 這樣一個signal:
技術分享

理清了這種關系後,就能夠把這個 signal 和自己編寫的排序的槽函數聯系起來了:

connect(ui->tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(mySortByColumn(int)));

註意到QTableWidget有這樣一個排序函數sortByColumn:
技術分享

當中Qt::SortOrder是一個枚舉類型,它有升序和降序兩個值:
技術分享

編寫自己的槽函數 mySortByColumn:

void MainWindow::mySortByColumn(int column)
{
    static bool f = true;
    ui->tableWidget->sortByColumn(column, f ? Qt::AscendingOrder : Qt::DescendingOrder);
    f = !f;
}

這樣就能夠實現點擊某列的header,使該列按升序(降序)排列,再點擊一次,使該列按降序(升序)排列。
效果圖:
Name字段按升序排列:
技術分享
Max字段按將序排列:
技術分享

5、在QTableWidget單元格中插入checkBox

for(int i = 0; i < ui->tableWidget->rowCount(); i++) {
    QTableWidgetItem *item_flag = new QTableWidgetItem();
    item_flag->setCheckState(regInfo[i]->getFlag() ? Qt::Checked : Qt::Unchecked);
    ui->tableWidget->setItem(i, 8, item_flag);
}

效果圖:
技術分享

6、代碼

本樣例的代碼 托管在gitHub上

參考:Qt5.4幫助文檔

Qt下QTableWidget的使用