QTableWidget表格控件的用法(非常详细)
- [1] QTableWidget表格控件的用法(非常详细)
- [2] QTableWidget详解
- 1.常用API设置
- 自动调整行高和列宽
- 设置表格内容是否可编辑
- 设置行表头、列表头是否显示
- 2.添加子项
- 3.右键弹出菜单
- 4.设置风格
- 5.清空
- 6.运行截图
- 相关推荐
- [3] QTableWidget表头、内容字体大小、颜色、背景颜色等设置
- [4] QTableWidget 添加 按钮、进度条、下拉框,以及处理事件
- 一 、 添加 按钮、进度条、下拉框
- 二、 获取那个 按钮 和 下拉框 位置
- 三 、修改进度条
- [5] QTableWidget中添加下拉框、复选框等操作
- 一、TableWidget中添加下拉框
- 1.1 源码
- 1.2 实际使用
- 1.3 效果
- 二、获取TableWidget中下拉框的下标
- 三、设置TableWidget中下拉框的下标
- 四、TableWidget中加入复选框
- 4.1 代码
- 4.2 效果
- 五、获取TableWidget中设置的复选框状态
- 注意事项
- 意见
- [6] QTableView 实现在单元格添加下拉框 QComboBox
- 1)通过setIndexWidget方法实现
- 2)通过重写setData()与data()来实现
- [7] 测试源代码及运行效果图
- mainwindow.h
- mainwindow.cpp
[1] QTableWidget表格控件的用法(非常详细)
原文链接:https://blog.csdn.net/ccc369639963/article/details/122683773
QTableWidget 是 Qt 提供的一种表格控件(如图 1 所示),类似于我们经常使用的 Excel 表格,可以将数据以表格的方式展示给用户。
整个 QTableWidget 表格可以分为 3 个区域:
区域 ① 和 ② 都是表头,区域 ① 设置每一行的表头,区域 ② 设置每一列的表头。我们可以自定义两个区域内的表头,比如第一列是各个教程的名称,所以第一列的表头可以修改为“教程名称”;
区域 ③ 为数据区,表格中所有的数据都位于此区域,该区域内可以存放单元格,也可以存放按钮、文本框等控件。
默认情况下,表格会显示表头,表头的内容为行号或列号。根据实际需要,我们可以将表头隐藏起来。
QTableWidget 继承自 QTableView 类,QTableView 类也可以用来显示表格控件。QTableWidget 可以看做是 QTableView 的“简易版”或者“升级版”,它们的区别在于:
QTableWidget 使用起来更简单,而 QTableView 的用法相对比较复杂。
QTableView 可以存储大量的数据(例如几十万甚至几百万),用户浏览表格中的数据时不会出现卡顿等现象;尽管 QTableWidget 也能用来存储大量的数据,但用户使用时可能出现卡顿等现象,且显示的数据越多,类似的现象越明显。
总之,QTableWidget 只适合显示少量的数据(几百或几千个),如果想要显示更多的数据,应该用 QTableView。此外,QTableView 还有一些更高级的用法,我们会在讲解 QTableView 时做重点介绍。
QTableWidget 框架在实际开发中经常使用,如果您是一名初学者,我建议先学习 QTableWidget 控件,它可以降低您学习 QT 表格控件的成本,可以更快地掌握表格的用法。
QTableWidget表格的创建
使用 QTableWidget 控件,必须先引入头文件。
QTableWidget 类提供了 2 个构造函数,分别是:
QTableWidget(QWidget *parent = Q_NULLPTR)
QTableWidget(int rows, int columns, QWidget *parent = Q_NULLPTR)
第一个构造函数可以在指定的 parent 父窗口中创建一个空的表格,表格中不显示任何单元格(如图 2a) 所示)。第二个构造函数可以在指定的 parent 父窗口中创建一个表格,表格中整齐地排列着 rows 行 columus 列的单元格,每个单元格都是空的(如图 2b) 所示)。
图 2 创建 QTableWidget 表格
实用 QTableWidget 表格之前,必须指定表格的行和列。我们可以直接调用第 2 个构造函数,这样既创建了表格又指定了行和列。当然,也可以调用第 1 个构造函数先创建表格,然后借助 QTableWidget 类提供的成员方法指定行和列,两种方式都可以。
与数组下标类似,QTableWidget 表格单元格的行标和列标都是从 0 开始。例如在图 2b) 中,选中的单元格的坐标是 (0, 0)。
QTableWidgetItem单元格
QTableWidget 表格中,每个单元格都是 QTableWidgetItem 类的实例对象。
定义 QTableWidgetItem 类的实例对象之前,程序中要引入头文件。QTableWidgetItem 类提供了 4 个构造函数:
QTableWidgetItem(int type = Type)
QTableWidgetItem(const QString &text, int type = Type)
QTableWidgetItem(const QIcon &icon, const QString &text, int type = Type)
QTableWidgetItem(const QTableWidgetItem &other) //复制(拷贝)构造函数
text 参数用于指定单元格要显示的文本(字符串),icon 参数用于指定单元格要显示的图标,type 参数配有默认值,很少用到。
QTableWidgetItem 单元格通常用来存放 text 文本和 icon 图标,借助该类提供的 setBackground()、setTextAlignment() 等成员方法,我们可以轻松设置每个单元格的字体、颜色、背景等。
QTableWidgetItem 类还对<小于运算符进行了重载,根据各个单元格存储的文本内容(字符串),多个单元格之间可以直接比较大小。借助这一特性,我们可以很轻易地实现“单元格排序”功能。
默认情况下,用户可以选中 QTableWidget 表格中的某个单元格,还可以对目标单元格中的文本内容进行修改。通过设置 QTableWidget 表格,可以禁止用户编辑所有单元格。
QTableWidgetItem 类提供了很多实用的成员方法,其中比较常用的方法如下表所示:
表 1 QTableWidgetItem成员方法
QTableWidget表格的使用
对于创建好的 QTableWidget 表格,我们可以借助该类提供的成员方法快速地操作它。
QTableWidget 类提供了很多实用的成员方法,它还从父类继承了很多方法,下表给大家罗列了实际场景中操作 QTableWidget 表格用得最多的几个方法,这些方法是初学者必须要掌握的:
QTableWidget类常用成员方法
QTableWidget信号和槽
QTableWidget 类提供的信号函数,可以监听用户对表格中的哪个单元格进行了何种操作,常见的操作包括点击、双击、按下、编辑等。
下表展示了 QTableWidget 类提供的一些信号函数以及它们各自的功能:
表 3 QTableWidget信号函数
表 4 QTableWidget 槽函数
QTableWidget表格实例
接下来通过一个实例,带大家更深入地了解 QTableWidget 控件的用法。
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QStringList>
#include <QDebug>
#include <QPushButton>
using namespace std;
class QMyLabel:public QLabel{Q_OBJECT
public slots:void rsetText(QTableWidgetItem * item);
};
void QMyLabel::rsetText(QTableWidgetItem * item){this->setText(item->text());
}
int main(int argc, char *argv[])
{QApplication a(argc, argv);//创建一个窗口,作为输入框和列表框的父窗口QWidget widget;//设置窗口的标题widget.setWindowTitle("QTableWidget控件");//自定义窗口的大小widget.resize(900,500);//在 widget 窗口中添加一个 4 行 3 列的表格QTableWidget TableWidget(4,3,&widget);//自定义表格的尺寸和字体大小TableWidget.resize(900,350);TableWidget.setFont(QFont("宋体",20));//设置表格中每一行的表头TableWidget.setHorizontalHeaderLabels(QStringList() << "教程" << "网址" << "状态");//设置表格数据区内的所有单元格都不允许编辑TableWidget.setEditTriggers(QAbstractItemView::NoEditTriggers);//设置表格中每一行的内容TableWidget.setItem(0,0,new QTableWidgetItem("C语言"));TableWidget.setItem(0,1,new QTableWidgetItem("http://c.tian.net/c/"));TableWidget.setItem(0,2,new QTableWidgetItem("已更新"));TableWidget.setItem(1,0,new QTableWidgetItem("Qt教程"));TableWidget.setItem(1,1,new QTableWidgetItem("http://c..net/qt/"));TableWidget.setItem(1,2,new QTableWidgetItem("更新"));TableWidget.setItem(2,0,new QTableWidgetItem("C教程"));TableWidget.setItem(2,1,new QTableWidgetItem("http://c.tian.net/cplus/"));TableWidget.setItem(2,2,new QTableWidgetItem("已更新完毕"));//向 widget 窗口中添加一个文本框QMyLabel lab;lab.setText("选中单元格");lab.setParent(&widget);//自定义文本框的尺寸和位置lab.resize(900,150);lab.move(0,350);lab.setAlignment(Qt::AlignCenter);lab.setFont(QFont("宋体",16));widget.show();//为表格和文本框之间建立关联,当用户点击表格中某个单元格时,文本框显示单元格内的文本内容。QObject::connect(&TableWidget,&QTableWidget::itemClicked,&lab,&QMyLabel::rsetText);return a.exec();
}
//QMyLabel类的定义应该放到 .h 文件中,本例中将其写到 main.cpp 中,程序最后需要添加 #include "当前源文件名.moc" 语句,否则无法通过编译。
#include "main.moc"
[2] QTableWidget详解
原文链接:https://blog.csdn.net/wzz953200463/article/details/110004261
1.常用API设置
//设置列数ui->tableWidget->setColumnCount(4);//设置行数ui->tableWidget->setRowCount(5);//去除选中虚线框ui->tableWidget->setFocusPolicy(Qt::NoFocus);//表头标题用QStringList来表示QStringList headerText;headerText<<"姓 名"<<"性 别"<<"出生日期"<<"国 籍";ui->tableWidget->setHorizontalHeaderLabels(headerText);//设置列宽ui->tableWidget->setColumnWidth(0,200);ui->tableWidget->setColumnWidth(1,200);ui->tableWidget->setColumnWidth(2,200);ui->tableWidget->setColumnWidth(3,200);//需要打开右键菜单属性,则必须设置ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);//设置最后一栏自适应长度ui->tableWidget->horizontalHeader()->setStretchLastSection(true);//设置列内容自适应宽度//ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//设置为可以选中多个目标,按ctrl键ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);//开启交替行背景色,在设置style为交替颜色时必须开启ui->tableWidget->setAlternatingRowColors(true);//清除表格数据区的所有内容,但是不清除表头。
// ui->tableWidget->clearContents();//清除表格数据区的所有内容,包括表头。
// //ui->tableWidget->clear();
自动调整行高和列宽
QTableWidget 有几个函数自动调整表格的行高和列宽,分别如下:
- resizeColumnsToContents():自动调整所有列的宽度,以适应其内容。
- resizeColumnToContents(int column):自动调整列号为 co/www 的列的宽度。
- resizeRowsToContents():自动调整所有行的高度,以适应其内容。
- resizeRowToContents(int row):自动调整行号为 raw 的行的高度。
设置表格内容是否可编辑
- ui->tableInfo->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);//双击或获取焦点后单击,进入编辑状态
- ui->tableInfo->setEditTriggers(QAbstractItemView::NoEditTriggers); //不允许编辑
设置行表头、列表头是否显示
-
ui->tableInfo->horizontalHeader()->setVisible(checked);//是否显示水平表头
-
ui->tableInfo->verticalHeader()->setVisible(checked);//是否显示垂直表头
选择模式 -
ui->tableInfo->setSelectionBehavior(QAbstractItemView::Selectltems); 单元格选择
-
ui->tableInfo->setSelectionBehavior(QAbstractItemView::SelectRows); 行选择
2.添加子项
这里添加三个string,和一个自定义的combobox
QComboBox *combox1 = new QComboBox(ui->tableWidget);combox1->addItem("man");combox1->addItem("woman");QComboBox *combox2 = new QComboBox(ui->tableWidget);combox2->addItem("man");combox2->addItem("woman");QComboBox *combox3 = new QComboBox(ui->tableWidget);combox3->addItem("man");combox3->addItem("woman");QComboBox *combox4 = new QComboBox(ui->tableWidget);combox4->addItem("man");combox4->addItem("woman");QComboBox *combox5 = new QComboBox(ui->tableWidget);combox5->addItem("man");combox5->addItem("woman");//添加ui->tableWidget->setItem(0,0,new QTableWidgetItem("Tom"));//ui->tableWidget->setItem(0,1,new QTableWidgetItem("man"));ui->tableWidget->setItem(0,2,new QTableWidgetItem("1999.11.11"));ui->tableWidget->setItem(0,3,new QTableWidgetItem("England"));ui->tableWidget->setItem(1,0,new QTableWidgetItem("Jery"));//ui->tableWidget->setItem(1,1,new QTableWidgetItem("man"));ui->tableWidget->setItem(1,2,new QTableWidgetItem("1997.08.12"));ui->tableWidget->setItem(1,3,new QTableWidgetItem("England"));ui->tableWidget->setItem(2,0,new QTableWidgetItem("Mary"));//ui->tableWidget->setItem(2,1,new QTableWidgetItem("woman"));ui->tableWidget->setItem(2,2,new QTableWidgetItem("1998.03.12"));ui->tableWidget->setItem(2,3,new QTableWidgetItem("England"));ui->tableWidget->setItem(3,0,new QTableWidgetItem("Jessy"));//ui->tableWidget->setItem(3,1,new QTableWidgetItem("woman"));ui->tableWidget->setItem(3,2,new QTableWidgetItem("2000.04.17"));ui->tableWidget->setItem(3,3,new QTableWidgetItem("England"));ui->tableWidget->setItem(4,0,new QTableWidgetItem("Jim"));//ui->tableWidget->setItem(4,1,new QTableWidgetItem("man"));ui->tableWidget->setItem(4,2,new QTableWidgetItem("1997.09.28"));ui->tableWidget->setItem(4,3,new QTableWidgetItem("England"));ui->tableWidget->setCellWidget(0,1,combox1);ui->tableWidget->setCellWidget(1,1,combox2);ui->tableWidget->setCellWidget(2,1,combox3);ui->tableWidget->setCellWidget(3,1,combox4);ui->tableWidget->setCellWidget(4,1,combox5);
//设置单个item属性
//对单个item进行设置QTableWidgetItem *item = new QTableWidgetItem("item");//获取原有字体设置QFont font = item->font();//设置为粗体font.setBold(true);//字体大小font.setPointSize(12);//字体颜色item->setTextColor(Qt::red);//设置字体item->setFont(font);//文本对齐格式item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
3.右键弹出菜单
这里添加一个右键菜单,有两个action,一个删除 一个添加
m_menu = new QMenu(this);m_actionAdd = new QAction("添加",m_menu);connect(m_actionAdd,&QAction::triggered,this,&Form::slotAdd);m_actionDel = new QAction("删除",m_menu);connect(m_actionDel,&QAction::triggered,this,&Form::slotDel);m_menu->addAction(m_actionAdd);m_menu->addAction(m_actionDel);connect(ui->tableWidget,&QTableWidget::customContextMenuRequested,this,&Form::slotPopMenu);void Form::slotAdd(){int row = ui->tableWidget->currentRow();ui->tableWidget->insertRow(row);}void Form::slotDel(){int row = ui->tableWidget->currentRow();ui->tableWidget->removeRow(row);}void Form::slotPopMenu(const QPoint &pos){qDebug()<<pos.x()<<" "<<pos.y();QPoint p;p.setX(pos.x());p.setY(pos.y() + m_menu->height() / 2 );m_menu->exec(ui->tableWidget->mapToGlobal(p));}
4.设置风格
这里简单的设置了一下颜色,头部样式,仅供参考。
const QString styles = "QTableView\
{\selection-background-color: qlineargradient(x1: 0, y1: 0, x2: 0.5, y2: 0.5,\stop: 0 #616161, stop: 1 505050);\/*alternate-background-color:blue;*/\
}";const QString headerStyle = "QHeaderView::section\
{\background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,\stop:0 #616161, stop: 0.5 #505050,\stop: 0.6 #434343, stop:1 #656565);\color: white;\padding-left: 4px;\border: 1px solid #6c6c6c;\
}\
/*QHeaderView::section:checked\
{\background-color: red;\
}*/";ui->tableWidget->setStyleSheet(styles);ui->tableWidget->horizontalHeader()->setStyleSheet(headerStyle);
5.清空
clear() 和 removeRow方法都会delete项数据,不必担心内存泄露。
//清除表格数据区的所有内容,但是不清除表头。ui->tableWidget->clearContents();//ui->tableWidget->clear();int nCount = ui->tableWidget->rowCount();for(int i=0;i<nCount;i++){ui->tableWidget->removeRow(0);}
6.运行截图
相关推荐
Qt QTreeView 详解
QTreeWidget 详解
QTableView详解
QListWidget详解
QListView详解
[3] QTableWidget表头、内容字体大小、颜色、背景颜色等设置
原文链接:https://blog.csdn.net/ydyuse/article/details/105155286
主要完成设置:
1、是否显示格子线。
2、禁止编辑
3、默认高度,宽度
4、选中模式
5、排序
6、某列是否设置选中框
7、某个单元格单独设置字体
8、表头内容设置
9、表格数据填充示例
10、隐藏横向表头
11、qss样式表设置字体、颜色示例等。
运行效果如下
下面直接上代码,完全可以直接拷贝用:
QString qssTV = "QTableWidget::item:hover{background-color:rgb(92,188,227,200)}""QTableWidget::item:selected{background-color:#1B89A1}""QHeaderView::section,QTableCornerButton:section{ \padding:3px; margin:0px; color:#DCDCDC; border:1px solid #242424; \border-left-width:0px; border-right-width:1px; border-top-width:0px; border-bottom-width:1px; \
background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #646464,stop:1 #525252); }"
"QTableWidget{background-color:white;border:none;}";//ui->tableWidget->setShowGrid(true); //设置显示格子线
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止编辑
ui->tableWidget->horizontalHeader()->setStretchLastSection(true); //行头自适应表格
ui->tableWidget->horizontalHeader()->setFont(QFont("song", 12));//点击表时不对表头行光亮(获取焦点)
ui->tableWidget->horizontalHeader()->setHighlightSections(false);
//设置表头字体加粗QFont font = ui->tableWidget->horizontalHeader()->font();
font.setBold(true);
ui->tableWidget->horizontalHeader()->setFont(font);
//ui->tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:lightblue;}"); //skyblue设置表头背景色
//ui->tableWidget->setStyleSheet("selection-background-color:lightblue;"); //设置选中背景色ui->tableWidget->setStyleSheet(qssTV);ui->tableWidget->horizontalHeader()->setHighlightSections(false); //点击表头时不对表头光亮
ui->tableWidget->setSelectionMode(QAbstractItemView::ContiguousSelection);//选中模式为多行选中
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//所有单元格的字体 设置成一样
ui->tableWidget->setFont(QFont("song", 12)); ui->tableWidget->setRowCount(1); //设置行数
ui->tableWidget->setColumnCount(8); //设置列数
ui->tableWidget->setWindowTitle("TABLE演示");
QStringList header;header<<"序号"<<"名称"<<"设备ID"<<"设备IP"<<"设备端口"<<"型号"<<"厂家"<<"备注";
ui->tableWidget->setHorizontalHeaderLabels(header);//去掉默认行号 可以用horizontalHeader() ->setVisible(false)隐藏横向表头
QHeaderView *header1 = ui->tableWidget->verticalHeader();
header1->setHidden(true);
//设置单元格大小
ui->tableWidget->horizontalHeader()->setDefaultSectionSize(50); //设置默认宽度
ui->tableWidget->verticalHeader()->setDefaultSectionSize(30); //设置一行默认高度
ui->tableWidget->setColumnWidth(1,110);
ui->tableWidget->setColumnWidth(2,110);
ui->tableWidget->setColumnWidth(4,180);
ui->tableWidget->setColumnWidth(5,110);
ui->tableWidget->setColumnWidth(6,80);
ui->tableWidget->setColumnWidth(7,80);ui->tableWidget->setSortingEnabled(true); //启动排序for (int crowCount = 0; crowCount < 20; ++crowCount)
{//插入数据QTableWidgetItem *check=new QTableWidgetItem(QString::number(crowCount)); check->setCheckState(Qt::Unchecked); //是否设置选中框ui->tableWidget->insertRow(crowCount);check->setText(QString::number(crowCount)); //显示序号ui->tableWidget->setItem(crowCount,0,check); //插入复选框for(int j=1; j<8; j++ ){ui->tableWidget->setItem(crowCount,j,new QTableWidgetItem(QString::number(j)));}
}
单元格单独设置字体方法:
QTableWidgetItem *item = new QTableWidgetItem;item->setText(strDev);
item->setFont(QFont("song", 14));
ui->tableWidget->setItem(crowCount,j,item);
[4] QTableWidget 添加 按钮、进度条、下拉框,以及处理事件
原文链接: https://blog.csdn.net/chen1231985111/article/details/125681034?ops_request_misc=&request_id=&biz_id=102&utm_term=qtablewidget%E6%B7%BB%E5%8A%A0%E4%B8%8B%E6%8B%89%E6%A1%86&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-125681034.nonecase&spm=1018.2226.3001.4187
一 、 添加 按钮、进度条、下拉框
给 按钮 和 下拉框 添加信号和槽, 注意:每个控件都起个名字, 后面通过名字来查找控件。
pb->setObjectName(QStringLiteral("proBar")); // 设置按钮名称
// 添加进度条QProgressBar *pb = new QProgressBar(this);pb->setObjectName(QStringLiteral("proBar")); // 设置按钮名称pb->setMinimumHeight(20);pb->setFormat(QString("当前进度为:%1%").arg(0));pb->setValue(0);pb->setMaximum(100);pb->setMinimum(0);pb->setAlignment(Qt::AlignCenter);font.setPointSize(8);pb->setFont(font);pb->setStyleSheet("QProgressBar {border: 2px solid grey;""border-radius: 5px;""color:#ff6600;""background-color: #E9E9E9;""text-align: center;}""QProgressBar::chunk {background-color: rgb(0,250,0) ;}");QWidget *wg = new QWidget(this);QHBoxLayout *verticalLayouts = new QHBoxLayout(wg);verticalLayouts->setObjectName(QString::fromUtf8("verticalLayouts"));verticalLayouts->setContentsMargins(5,0,5,0);verticalLayouts->setSpacing(0);verticalLayouts->addWidget(pb);ui->tableWidget->setCellWidget(rowNo,colPro,wg);// 下拉框QComboBox *cbox = new QComboBox(this);cbox->setObjectName(QStringLiteral("combox")); // 设置按钮名称cbox->addItem(QIcon(":/ico/img/boy.png"),"男");cbox->addItem(QIcon(":/ico/img/girl.png"),"女");cbox->setCurrentText(strSex);// 设置文字居中cbox->setEditable(true); // 变为可编辑状态cbox->lineEdit()->setAlignment(Qt::AlignCenter); // 文字居中// cbox->lineEdit()->setReadOnly(true); // 改为只读状态connect(cbox,SIGNAL(currentIndexChanged(const QString &)), this,SLOT(comboBoxCurrentIndexChanged(const QString &))); // 添加 下拉框 点击处理QWidget *wgc = new QWidget(this);QHBoxLayout *verticalLayoutc = new QHBoxLayout(wgc);verticalLayoutc->setObjectName(QString::fromUtf8("verticalLayouts"));verticalLayoutc->setContentsMargins(5,0,5,0);verticalLayoutc->setSpacing(0);verticalLayoutc->addWidget(cbox);ui->tableWidget->setCellWidget(rowNo,colComBox,wgc);// 添加按钮QPushButton *bt = new QPushButton(this);bt->setText("加载进度");connect(bt,SIGNAL(clicked()),this,SLOT(createEditwidget())); // 添加 按钮 点击处理QWidget *wgb = new QWidget(this);QHBoxLayout *verticalLayoutb = new QHBoxLayout(wgb);verticalLayoutb->setContentsMargins(10,1,10,1);verticalLayoutb->addWidget(bt);ui->tableWidget->setCellWidget(rowNo,colButton,wgb);
二、 获取那个 按钮 和 下拉框 位置
通过转换 this->sender() ,得到按钮的坐标, 通过坐标转换为按钮所在行列,下拉框原理和这个相同
//按钮点击,获取所在行的行号
void MainWindow::createEditwidget()
{QPushButton *bt = dynamic_cast<QPushButton*>(this->sender());if (bt == nullptr)return;int x = bt->parentWidget()->frameGeometry().x();int y = bt->parentWidget()->frameGeometry().y();QModelIndex index = ui->tableWidget->indexAt(QPoint(x,y));int row = index.row();int colum = index.column();
}
三 、修改进度条
通过上面代码找到 按钮 所在行, 然后找到 进度条 所在的widget, 通过定义的名字就能找到控件
// 获取行列的widgetQWidget *wig = ui->tableWidget->cellWidget(row,colPro);// 通过名称,找到控件QProgressBar* progBar= wig->findChild<QProgressBar *>("proBar");int value = progBar->value() + 5;progBar->setValue(value);progBar->setFormat(QString("当前进度为:%1%" ).arg(qRound(100.0*value / 100)));
最后的效果:
[5] QTableWidget中添加下拉框、复选框等操作
原文链接:https://blog.csdn.net/qq_36365231/article/details/128429341
1、添加下拉框(comboBox),并设置内容及居中
2、获取TableWidget中下拉框的下标
3、设置TableWidget中下拉框的下标
4、添加复选框(checkBox),并设置居中
5、获取TableWidget中添加的复选框状态
一、TableWidget中添加下拉框
1.1 源码
//设置comboBox的下拉内容,并设置内容居中
void MainWindow::ComboBoxSetItems(QComboBox *comboBox, QStringList *items)
{QListWidget *listWidget = new QListWidget(this);QLineEdit *lineEdit = new QLineEdit;for(int i=0;i<items->count();i++){QListWidgetItem *item = new QListWidgetItem(items->at(i));item->setTextAlignment(Qt::AlignCenter);listWidget->addItem(item);}//ComboBox使用listWidget的内容comboBox->setModel(listWidget->model());comboBox->setView(listWidget);lineEdit->setReadOnly(true);lineEdit->setAlignment(Qt::AlignCenter);comboBox->setLineEdit(lineEdit);
}//TableWidget中加入下拉框,并设置下拉框的内容及初始下标
void MainWindow::TableWidgetAddComboBox(QTableWidget *tableWidget,int x, int y, QStringList items,int comboBoxIdx)
{QComboBox *combox = new QComboBox();combox->setStyleSheet("background-color:rgb(255,255,255)");MainWindow::ComboBoxSetItems(combox,&items); //下拉框的内容combox->setCurrentIndex(comboBoxIdx); //下拉框初始下标tableWidget->setCellWidget(x,y,(QWidget*)combox);
}
1.2 实际使用
void MainWindow::TableWidget_Init()
{QStringList items;//静止超时,在TableWidget的(0,1)单元格设置一个下拉框,并设置初始下标为3![请添加图片描述](https://img-blog.csdnimg.cn/a87bcc562ffd483391ef266ee7812df2.png)items << tr("关闭") << tr("60秒") << tr("120秒") << tr("180秒") << tr("240秒") << tr("300秒");MainWindow::TableWidgetAddComboBox(ui->baseParamInfo_tableWidget,0,0,items,3);items.clear();//降频唤醒,在TableWidget的(0,1)单元格设置一个下拉框,并设置初始下标为3items << tr("关闭") << tr("1秒") << tr("2秒") << tr("3秒") << tr("4秒") << tr("5秒") << tr("6秒") << tr("7秒") << tr("8秒");MainWindow::TableWidgetAddComboBox(ui->baseParamInfo_tableWidget,0,1,items,3);items.clear();//无线功率,在TableWidget的(0,2)单元格设置一个下拉框,并设置初始下标为2items << tr("自动") << tr("24db") << tr("21db") << tr("18db") << tr("15db") << tr("12db") << tr("9db");MainWindow::TableWidgetAddComboBox(ui->baseParamInfo_tableWidget,0,2,items,2);items.clear();
}
1.3 效果
二、获取TableWidget中下拉框的下标
//获取TableWidget中ComboBox的下标
int MainWindow::getComboBoxCurrIndex_InTableWidget(QTableWidget *tableWidget, int x, int y)
{QWidget *widget = tableWidget->cellWidget(x,y);QComboBox *combox = (QComboBox*)widget;return combox->currentIndex();
}
三、设置TableWidget中下拉框的下标
//设置TableWidget中ComboBox的下标
void MainWindow::setComboBoxCurrIndex_InTableWidget(QTableWidget *tableWidget, int x, int y, int idx)
{QWidget *widget = tableWidget->cellWidget(x,y);QComboBox *combox = (QComboBox*)widget;combox->setCurrentIndex(idx);
}
四、TableWidget中加入复选框
4.1 代码
//TableWidget中加入复选框
void MainWindow::TableWidgetAddCheckBox(QTableWidget *tableWidget, int x, int y, QString text, Qt::CheckState checkState)
{QWidget *widget = new QWidget();QHBoxLayout *layout = new QHBoxLayout();QCheckBox *checkBox = new QCheckBox;checkBox->setText(text); //复选框文本checkBox->setCheckState(checkState); //复选框初始状态layout->addWidget(checkBox,0,Qt::AlignCenter); //居中layout->setMargin(0); //左右间距widget->setLayout(layout);tableWidget->setCellWidget(x,y,widget);
}
//实际使用
//在TableWidget的(0,6)出添加一个复选框,无文本,默认不选择
MainWindow::TableWidgetAddCheckBox(ui->UL_List_tableWidget,0,6,NULL,Qt::Unchecked);
4.2 效果
在(0,6)的位置添加了一个复选框,无文本,默认不选择
五、获取TableWidget中设置的复选框状态
//获取TableWidget中的复选框状态
Qt::CheckState MainWindow::getCheckBoxCurrState_InTableWidget(QTableWidget *tableWidget, int x, int y)
{QWidget *widget = tableWidget->cellWidget(x,y);QHBoxLayout *layout = qobject_cast<QHBoxLayout *>(widget->layout());QCheckBox *checkBox = qobject_cast<QCheckBox *>(layout->itemAt(0)->widget());return checkBox->checkState();
}
注意事项
https://blog.csdn.net/sinat_14854721/article/details/116140317?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_utm_term~default-5-116140317-blog-128429341.235v32pc_relevant_default_base3&spm=1001.2101.3001.4242.4&utm_relevant_index=8
一般情况下tablewidget 添加控件的时候, 合理的情况本应该是使用代理,更高效的一点是 使用 tableview 和代理。 但是有时为了开发快,以及开发简易程度 就使用setCellWidget 来快速开发:(极不推荐这种,后期业务逻辑写起来很淡腾)
void setCellWidget(int row, int column, QWidget *widget);`
案例
{// 为了combox 居中又不得不用QWidegt 嵌套起来(后期数据多了,刷新数据很慢的。)QWidget *Widget = new QWidget();QHBoxLayout *vLayout = new QHBoxLayout();QComboBox *comBox = new QComboBox();comBox->addItems({"1","2"});vLayout->addWidget(comBox);comBox->setCurrentIndex(comboxindex);//Widget中添加布局Widget->setLayout(vLayout);Widget->setStyleSheet({"background: #2F3133;"});//表格中添加Widgetui->tableWidget->setCellWidget(currentrow, 7, (QWidget*)Widget);```//触发combox 必须写对应的曹函数connect(comBox, SIGNAL(currentIndexChanged(int)),this, SLOT(slotComBox(int)));
}void XXXXX::slotComBox(int index)
{QComboBox * comboBox = dynamic_cast<QComboBox *>(sender());if(comboBox == nullptr) return;// 获取索引 注意 comboBox->parent() 而不是 combox// 当单独一个控件的时候用combox,事例中为了居中引入了QWidget 嵌套comboxQModelIndex modelindex = ui->tableWidget->indexAt(dynamic_cast<QWidget *>(comboBox->parent())->pos());int row = modelindex.row();int column = modelindex.column();//XXXXXX 具体逻辑}
意见
能用代理加载控件,最好用代理, 别用这种。
前期开发界面确实很快, 但后期写业务, 尤其是多个控件有联动关系的时候, 很麻烦
[6] QTableView 实现在单元格添加下拉框 QComboBox
原文链接:https://blog.csdn.net/mj348940862/article/details/124474100
1)通过setIndexWidget方法实现
实现:
1)继承代理类,实现自定义代理,网上很多教程,这里不再赘叙;
2)更加方便的方法,使用接口:
void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget);
其实QTableWidget的setCellWidget借口内部也是调用 setIndexWidget。
示例代码:
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QStandardItemModel* model = new QStandardItemModel();ui->tableView->setModel(model);ui->tableView->setFocusPolicy(Qt::NoFocus); //去掉选中单元格时的虚框model->setHorizontalHeaderLabels({"姓名", "年龄", "性别"});model->setItem(0, 0, new QStandardItem("张三"));model->setItem(0, 1, new QStandardItem("3"));QComboBox* cmb = new QComboBox();cmb->addItems({"男", "女"});ui->tableView->setIndexWidget(model->index(0, 2), cmb);model->setItem(1, 0, new QStandardItem("李四"));model->setItem(1, 1, new QStandardItem("5"));cmb = new QComboBox();cmb->addItems({"男", "女"});ui->tableView->setIndexWidget(model->index(1, 2), cmb);
}
2)通过重写setData()与data()来实现
使用QTableView,经常会有单选、多选、全选的需求,很多软件提供很简单、直观的方式——复选框。Qt中也可以很容易的进行实现。
1、编辑委托利用委托中重载createEditor(),激活QCheckBox,这个缺点是必须双击/选中,才能显示CheckBox控件。一般不满足实际中的直接显示的需要。
2、设置QAbstractTableModel的flags()函数,通过重写setData()与data()来实现。
3、使用QTableView的setIndexWidget(const QModelIndex &index, QWidget *widget)来实现。 此功能只应该用来显示可视区域内对应一个数据项的静态内容。如果想显示自定义的动态内容或执行自定义编辑器部件,子类化 QItemDelegate代替。也就是说,这只适合做静态数据的显示,不适合做一些插入、更新、删除操作的数据显示。
4、自定义委托,通过paint()方法来实现。这种方式比较复杂,但适合扩展,除了可以嵌入复选框,还可以通过绘制其它控件,按钮、图片等自定义风格。
下面就介绍最常用的方式,即方法二。
QMap用来保存选中行号以及对应的选中状态
QMap check_state_map;
setData()方法主要用来设置是否被选中,然后将对应的状态保存到QMap中;
QtableView中添加复选框
先创建一个Qt widgets 应用程序,并将mainwindow.cpp文件中修改为如下代码
#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QMessageBox>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QTableView>#include <QSqlTableModel>static bool createConnectionDateBase()
{QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");; //创建QSQLdatabase对象,指定QT使用的哪一种SQL。db.setDatabaseName("testSQL.db");if(!db.open()){QMessageBox::critical(NULL,"数据库打开失败","打开数据库失败!",QMessageBox::Cancel);return false;}QSqlQuery query;query.exec("create table TEST_SQL (id int(1) primary key,name char(200),age int(1),chenked int (1))");query.exec("insert into TEST_SQL values(1,'测试1',18,0)");query.exec("insert into TEST_SQL values(2,'测试2',19,0)");query.exec("insert into TEST_SQL values(3,'测试3',20,0)");return true;
}MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);if(!createConnectionDateBase()){return;}model = new QSqlTableModel(this);model->setTable("TEST_SQL");model->setHeaderData(0,Qt::Horizontal,tr("ID号"));model->setHeaderData(1,Qt::Horizontal,tr("姓名"));model->setHeaderData(2,Qt::Horizontal,tr("年龄"));model->select();QTableView *view = new QTableView(this);view->setModel(model);setCentralWidget(view);//ui->tableView->setModel(model);}MainWindow::~MainWindow()
{delete ui;
}
运行查看效果,
现在开始往这个表中添加复选框,需要继承QSqlTableModel类,在工程中Add new,新建一个C++类,名字为myTableModel,然后在将生成的mytablemodel.h和metaoblemodel.cpp修改为如下:
#ifndef MYTABLEMODEL_H
#define MYTABLEMODEL_H#include <QtSql>class myTableModel:public QSqlTableModel
{Q_OBJECT
public:myTableModel( QObject * parent = 0, QSqlDatabase db = QSqlDatabase() );bool setData( const QModelIndex &index, const QVariant &value, int role );QVariant data(const QModelIndex &index, int role) const;Qt::ItemFlags flags(const QModelIndex &index) const;
};#endif // MYTABLEMODEL_H
#include "mytablemodel.h"QMap<int, Qt::CheckState> check_state_map;
int checkColumn = 3;//将复选框放到第几列,从0开始计数myTableModel::myTableModel(QObject *parent, QSqlDatabase db)
{}bool myTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{if(!index.isValid())return false;if (role == Qt::CheckStateRole && index.column() == checkColumn){check_state_map[index.row()] = (value == Qt::Checked ? Qt::Checked : Qt::Unchecked);return true;}elsereturn QSqlTableModel::setData(index, value,role);
}QVariant myTableModel::data(const QModelIndex &index, int role) const
{if (!index.isValid())return QVariant();if (index.column() != checkColumn ){return QSqlTableModel::data(index, role);}switch(role){case Qt::CheckStateRole:if(index.column() == checkColumn){if (check_state_map.contains(index.row())){return check_state_map[index.row()] == Qt::Checked ? Qt::Checked : Qt::Unchecked;}return Qt::Unchecked;}default:return QVariant();}return QVariant();
}Qt::ItemFlags myTableModel::flags(const QModelIndex &index) const
{if (!index.isValid())return 0;if (index.column() == checkColumn)return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;elsereturn QSqlTableModel::flags(index);return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
然后将mianwindow.cpp中包含该头文件 mytablemodel.h 然后将mianwindow.cpp的构造函数修改为如下:
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);if(!createConnectionDateBase()){return;}model = new myTableModel(this);model->setTable("TEST_SQL");model->setHeaderData(0,Qt::Horizontal,tr("ID号"));model->setHeaderData(1,Qt::Horizontal,tr("姓名"));model->setHeaderData(2,Qt::Horizontal,tr("年龄"));model->select();QTableView *view = new QTableView(this);view->setModel(model);setCentralWidget(view);//ui->tableView->setModel(model);}
效果如下:
[7] 测试源代码及运行效果图
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QWidget>
#include <QLabel>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QStringList>
#include <QDebug>
#include <QPushButton>
#include <QComboBox>
#include <QMessageBox>
#include <QProgressBar>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void slotCmbox1IndexChanged(const QString &text);
private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//设置行数ui->tableWidget->setRowCount(5);//设置列数ui->tableWidget->setColumnCount(4);//表头标题用QStringList来表示QStringList header;header<<"姓名"<<"性别"<<"出生日期"<<"国籍";ui->tableWidget->setHorizontalHeaderLabels(header);//设置列宽ui->tableWidget->setColumnWidth(0, 200);ui->tableWidget->setColumnWidth(1, 100);ui->tableWidget->setColumnWidth(2, 100);ui->tableWidget->setColumnWidth(3, 100);
//需要打开右键菜单属性,则必须设置ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);//设置最后一栏自适应长度ui->tableWidget->horizontalHeader()->setStretchLastSection(true);//设置列内容自适应宽度ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//设置为可以选中多个目标,按ctrl键//ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);//开启交替行背景色,在设置style为交替颜色时必须开启ui->tableWidget->setAlternatingRowColors(true);//清除表格数据区的所有内容,但是不清除表头。ui->tableWidget->clearContents();//是否显示垂直表头ui->tableWidget->verticalHeader()->setVisible(false);//行选择模式ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);QComboBox *combox1 = new QComboBox(ui->tableWidget);combox1->addItem("man");combox1->addItem("woman");QComboBox *combox2 = new QComboBox(ui->tableWidget);combox2->addItem("man");combox2->addItem("woman");combox2->setCurrentText("woman");QComboBox *combox3 = new QComboBox(ui->tableWidget);combox3->addItem("man");combox3->addItem("woman");QComboBox *combox4 = new QComboBox(ui->tableWidget);combox4->addItem("man");combox4->addItem("woman");// QComboBox *combox5 = new QComboBox(ui->tableWidget);
// combox5->addItem("man");
// combox5->addItem("woman");
// combox5->setCurrentText("woman");QProgressBar *progressBar1 = new QProgressBar(ui->tableWidget);progressBar1->setRange(0,0);progressBar1->setValue(66);progressBar1->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);connect(combox1, &QComboBox::currentTextChanged, this, &MainWindow::slotCmbox1IndexChanged);connect(combox2, QOverload<const QString &>::of(&QComboBox::currentTextChanged), this, [=](const QString &text){QMessageBox::information(this, "提示信息", text);progressBar1->setRange(0,100);});connect(combox3, QOverload<const QString &>::of(&QComboBox::currentTextChanged), this, [=](const QString &text){QMessageBox::information(this, "提示信息", text);});connect(combox4, QOverload<const QString &>::of(&QComboBox::currentTextChanged), this, [=](const QString &text){QMessageBox::information(this, "提示信息", text);});
// connect(combox5, QOverload<const QString &>::of(&QComboBox::currentTextChanged), this, [=](const QString &text){
// QMessageBox::information(this, "提示信息", text);
// });ui->tableWidget->setCellWidget(0,1,combox1);ui->tableWidget->setCellWidget(1,1,combox2);ui->tableWidget->setCellWidget(2,1,combox3);ui->tableWidget->setCellWidget(3,1,combox4);
// ui->tableWidget->setCellWidget(4,1,combox5);ui->tableWidget->setCellWidget(4,1,progressBar1);//添加行记录ui->tableWidget->setItem(0,0,new QTableWidgetItem("Tom"));ui->tableWidget->setItem(0,2,new QTableWidgetItem("1999-11-11"));ui->tableWidget->setItem(0,3,new QTableWidgetItem("England"));ui->tableWidget->setItem(1,0,new QTableWidgetItem("Jery"));ui->tableWidget->setItem(1,2,new QTableWidgetItem("1979-01-21"));ui->tableWidget->setItem(1,3,new QTableWidgetItem("France"));ui->tableWidget->setItem(2,0,new QTableWidgetItem("Richard"));ui->tableWidget->setItem(2,2,new QTableWidgetItem("1979-09-06"));ui->tableWidget->setItem(2,3,new QTableWidgetItem("Chinese"));ui->tableWidget->setItem(3,0,new QTableWidgetItem("Frank"));ui->tableWidget->setItem(3,2,new QTableWidgetItem("1969-10-21"));ui->tableWidget->setItem(3,3,new QTableWidgetItem("France"));ui->tableWidget->setItem(4,0,new QTableWidgetItem("Andy"));ui->tableWidget->setItem(4,2,new QTableWidgetItem("1985-08-21"));ui->tableWidget->setItem(4,3,new QTableWidgetItem("Chinese"));//不允许编辑ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);QTableWidgetItem *item = ui->tableWidget->item(0,0);//获取原有字体设置QFont font = item->font();//设置为粗体font.setBold(true);//字体大小font.setPointSize(12);//字体颜色item->setTextColor(Qt::red);item->setFont(font);item = ui->tableWidget->item(1,0);//字体颜色item->setTextColor(Qt::red);item->setFont(font);item = ui->tableWidget->item(2,0);//字体颜色item->setTextColor(Qt::red);item->setFont(font);item = ui->tableWidget->item(3,0);//字体颜色item->setTextColor(Qt::red);item->setFont(font);item = ui->tableWidget->item(4,0);//字体颜色item->setTextColor(Qt::red);item->setFont(font);const QString styles = "QTableView\{\selection-background-color: qlineargradient(x1: 0, y1: 0, x2: 0.5, y2: 0.5,\stop: 0 #616161, stop: 1 505050);\/*alternate-background-color:blue;*/\}";const QString headerStyle = "QHeaderView::section\{\background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,\stop:0 #616161, stop: 0.5 #505050,\stop: 0.6 #434343, stop:1 #656565);\color: white;\padding-left: 4px;\border: 1px solid #6c6c6c;\}\/*QHeaderView::section:checked\{\background-color: red;\}*/";ui->tableWidget->setStyleSheet(styles);ui->tableWidget->horizontalHeader()->setStyleSheet(headerStyle);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::slotCmbox1IndexChanged(const QString &text)
{QMessageBox::information(this, "提示信息", text);
}