Qt下QTableWidget的使用

本文主要内容:

  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帮助文档

(完)

时间: 2024-08-02 05:10:44

Qt下QTableWidget的使用的相关文章

qt 下tablewidget 中要单独使一列不能编辑怎么办?

qt 下tablewidget 中要单独使一列不能编辑怎么办???最好能用一个button 控件控制 2012-03-31 19:57南山杨木 | 分类:其他编程语言 | 浏览2658次 分享到: 2012-04-01 16:29 提问者采纳 热心网友 修改该列item的flags. 例如: #include <QApplication>#include <QTableWidget>#include <QTableWidgetItem>int main(int argc

delphi中formatFloat代码初探(在qt下实现floatformat的函数)

由于项目需要,需要在qt下实现floatformat的函数.之前写过一个,但是写得不好.决定重新写一个,参考delphi xe2下的实现.把xe2下的相关代码都看了一遍,xe2的代码思路在这里贴出来.xe2下的代码在system.sysutils下,核心函数是InternalFloatToTextFmt.它有汇编的版本跟纯pascal的版本.汇编看不懂,参考的是纯pascal的版本. 整体流程是: 1)解析format格式化字符串 [delphi] view plain copy Result 

QT下资源使用和资源占用…(可以动态加载资源文件,这样不占内存)

原文地址:关于QT下资源使用和资源占用内存过多的问题作者:技术成就梦想 最近研究了一下如何从外部动态调用图片的问题,从而研究了图片资源的使用方法.网上最常见的帖子是这个,感觉总结的还不错. http://www.cnblogs.com/lzjsky/archive/2012/08/20/2647471.html 总的来说,就两种方式. 一种就是使用qrc资源文件,也就是在QT的工程中添加资源文件,这个方法比较简单容易操作,对于初学者来说比较容易上手,在资源比较少的时候可以使用.但是也有它的缺点,

VC++或QT下 高精度 多媒体定时器

在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了.如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便.先要包含头文件"mmsystem.h"和库文 件"winmm.lib". 虽然Win95下可视化开发工具如VC.Delphi.C++   Builder等都有专用的定时器控件Timer,而且使用很方便,可以实现一定的定时功能,但

Qt下QString转char*

Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 在Qt下怎样将QString转char*呢,需要用到QByteArray类,QByteArray类的说明详见Qt帮助文档. 因为char*最后都有一个'/0'作为结束符,而采用QString::toLatin1()时会在字符串后面加上'/0' 方法如下: Qs

zz Qt下 QString转char*和char []

以下内容为转载:http://www.cnblogs.com/Romi/archive/2012/03/12/2392478.html ----------------------------------- Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 在Qt下怎样将QString转char*呢,需要用到

Qt下 QString转char*

Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 在Qt下怎样将QString转char*呢,需要用到QByteArray类,QByteArray类的说明详见Qt帮助文档. 因为char*最后都有一个‘/0’作为结束符,而采用QString::toLatin1()时会在字符串后面加上‘/0’ 方法如下: Qs

解决Qt中QTableWidget类方法setItem 时导致程序崩溃问题

在为一个音乐播放器增加功能时莫明奇妙的出现程序崩溃,定位到是由于QTableWidget 的setItem方法导致的,最终在此处找到了解决方式. 大致是说不能在setItem之前连接cellChanged 信号,把连接cellChanged信号的语句放置在一连串的setItem(在表格插入一行后调用的)之后就可以了. 解决Qt中QTableWidget类方法setItem 时导致程序崩溃问题

QT 下opengl (认识)

虽然Qt不以效率著称,但是事实上有足够的优化,最最典型的就是默认的图形双缓冲,按照Windows下的编程惯例是需要手动开启,并通过额外的接口调用才能使用的,这一点在以前简单图形编程学习时比较过Qt,Win32 GDI时感受特别深刻,在没有额外处理的时候,Win32动画程序那个闪阿,而Qt程序非常稳定.事实上,我想,Qt的其他问题比效率严重多了,比如个人感觉Qt程序在Windows下刷新的感知明显没有Windows原生程序快,这点倒是值得改进.OpenGL只处理与3D图形的绘制,基本上不提供创建用