Qt下QTableWidget的使用
1、QTableWidget的基本設(shè)置
ui->tableWidget->setColumnCount(11); ui->tableWidget->setRowCount(NumOfReg); /* 設(shè)置 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); // 單個(gè)選中 ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); // 可以選中多個(gè)效果圖:
2、設(shè)置QTableWidget的某些字段不可編輯和背景顏色
設(shè)置tableWidget下某些字段可以編輯,某些字段不可以編輯的方法:
void QTableWidget::setItem(int row, int column, QTableWidgetItem * item)
Sets the item for the given row and column to item.
來(lái)看一下Qt::ItemFlags有哪些類型:
看到上面的幾個(gè)函數(shù),就知道了可以通過(guò)設(shè)置item,然后設(shè)置單元格的屬性。
每個(gè)單元格都要擁有一個(gè)自己的item,不能共用。
設(shè)置QTableWidget的背景顏色:
可以設(shè)置 QTableWidgetItem 的顏色:
當(dāng)然這里你也可以使用下面這個(gè)函數(shù),但這在Qt5.4的文檔里是不建議使用(deprecated)的:
效果圖:
3、QTableWidget單元格的插入
????下面的代碼中,regInfo是指針數(shù)組,創(chuàng)建了5個(gè)RegisterInfo類的對(duì)象,并填充了默認(rèn)字段。然后把這些字段值插入到相應(yīng)的單元格中。
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按字段值排序
????下面實(shí)現(xiàn)點(diǎn)擊每列的header,實(shí)現(xiàn)該列按字母順序升序或?qū)⑿蚺帕小?
horizontalHeader() 函數(shù)是QTableWidget從QTableView繼承而來(lái),它返回一個(gè)QHeaderView類型的指針。
而QHeaderView有一個(gè) sectionClicked 這樣一個(gè)signal:
理清了這樣的關(guān)系后,就可以把這個(gè) signal 和自己編寫(xiě)的排序的槽函數(shù)聯(lián)系起來(lái)了:
connect(ui->tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(mySortByColumn(int)));- 1
- 1
注意到QTableWidget有這樣一個(gè)排序函數(shù)sortByColumn:
其中Qt::SortOrder是一個(gè)枚舉類型,它有升序和降序兩個(gè)值:
編寫(xiě)自己的槽函數(shù) mySortByColumn:
void MainWindow::mySortByColumn(int column) {static bool f = true;ui->tableWidget->sortByColumn(column, f ? Qt::AscendingOrder : Qt::DescendingOrder);f = !f; }這樣就可以實(shí)現(xiàn)點(diǎn)擊某列的header,使該列按升序(降序)排列,再點(diǎn)擊一次,使該列按降序(升序)排列。
效果圖:
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); }
效果圖:
總結(jié)
以上是生活随笔為你收集整理的Qt下QTableWidget的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: bzoj4052
- 下一篇: WEB安全_csrf攻击