1、QTableWidget的基本设置

ui->tableWidget->setColumnCount(11);
ui->tableWidget->setRowCount(NumOfReg);
/* 设置 tableWidget */
ui->tableWidget->setHorizontalHeaderLabels(QStringList() << "Id" << "Name" << "Unit" << "Value" << "Min");
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);
}

效果图:

https://blog.csdn.net/swartz_lubel/article/details/54986244 

Qt下QTableWidget的使用的更多相关文章

  1. 【转】Qt下使用glut库

    ps:这个说的很明白,尤其是win10环境下用mingw环境时编程时碰到的问题, 1.加 windows.h 2.在.pro 添加libs     博文地址:Qt下使用glut库   本人使用的环境 ...

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

    由于项目需要,需要在qt下实现floatformat的函数.之前写过一个,但是写得不好.决定重新写一个,参考delphi xe2下的实现.把xe2下的相关代码都看了一遍,xe2的代码思路在这里贴出来. ...

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

    原文地址:关于QT下资源使用和资源占用内存过多的问题作者:技术成就梦想     最近研究了一下如何从外部动态调用图片的问题,从而研究了图片资源的使用方法.网上最常见的帖子是这个,感觉总结的还不错. h ...

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

    在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了.如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码 ...

  5. Qt下libusb-win32的使用(转)

    源:Qt下libusb-win32的使用(一)打印设备描述符 主要是在前一篇的基础上,学习libusb-win32的API使用.程序很简单,就是打印指定USB设备的设备描述符(当然其他描述符也是可以的 ...

  6. Qt下libusb-win32的使用方法(转)

    源:Qt下libusb-win32的使用方法 之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下 ...

  7. 关于QT下资源使用和资源占用…

    原文地址:关于QT下资源使用和资源占用内存过多的问题作者:技术成就梦想     最近研究了一下如何从外部动态调用图片的问题,从而研究了图片资源的使用方法.网上最常见的帖子是这个,感觉总结的还不错. h ...

  8. Qt下libusb-win32的使用方法

    之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下载软件. 发现了libusb这个库可以用作无驱 ...

  9. Qt下QString转char*

    Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的 ...

随机推荐

  1. php内置的http server, 类似于nodejs里面和golang里面的

    原文:https://www.sitepoint.com/taking-advantage-of-phps-built-in-server/ ----------------------------- ...

  2. Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)

    http://my.phirobot.com/blog/2014-02-opencv_configuration_in_vs.html 2012年4月给同学写了篇傻瓜式的 VS2010+Opencv- ...

  3. android 利用cmdline,将參数从preloader传递到kernel

    以定义參数 cus_param 为例.int型变量. 1. Preloader部分 Platform.h(mediatek\platform\[$platform]\preloader\src\dri ...

  4. /dev/null 和 /dev/zero

    1.概论 -- 来自维基的解释 /dev/null  : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一 ...

  5. EL函数库

    一.EL函数库介绍 由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用. 这些EL函数在JSTL开发包中进行描述,因此在JSP页 ...

  6. 无源码情况下直接修改jar里内容思路

    当我们反编译的jar包里class被混淆过,这时反编译出来的java文件会有各种奇葩的问题,不能直接用,比如某框架需要注册码,这个时候我们只能通过层层反编译将验证码相关的部分绕过,如果这个代码不是那么 ...

  7. Drupal 7 driver for SQL Server and SQL Azure

    Drupal 7 driver for Microsoft SQL Server database engines. It supports both SQL Server (version 2008 ...

  8. 基于SSM + Redis的Shiro权限管理项目

    概述 本教程结合SSM(SpringMVC + Mybatis)框架讲解Shiro,讲解的内容有自定义shiro拦截器,Shiro Freemarker标签,Shiro JSP标签,权限控制讲解. 详 ...

  9. Android OpenGL 开发

    2013-06-30 Android OpenGL 开发 Android提供OpenGL包,专门用于3D的加速和渲染等. OpenGL, Open Graphics Library, 是一个专业的图形 ...

  10. iOS开发-代码片段(Code Snippets)提高开发效率

    简介 在 XCode4 引入了一个新特性,那就是“代码片段(Code Snippets)”.对于一些经常用到的代码,抽象成模板放到 Code Snippets 中,使用的时候就只需要键入快捷键就可以了 ...