QTableWidget表格控件的用法(非常详细)
- QTableWidget表格控件的用法(非常详细)
- QTableWidget详解
- 1.常用API设置
- 自动调整行高和列宽
- 设置表格内容是否可编辑
- 设置行表头、列表头是否显示
- 2.添加子项
- 3.右键弹出菜单
- 4.设置风格
- 5.清空
- 6.运行截图
- 相关推荐
- QTableWidget表头、内容字体大小、颜色、背景颜色等设置
- QTableWidget 添加 按钮、进度条、下拉框,以及处理事件
- 一 、 添加 按钮、进度条、下拉框
- 二、 获取那个 按钮 和 下拉框 位置
- 三 、修改进度条
- QTableWidget中添加下拉框、复选框等操作
- 一、TableWidget中添加下拉框
- 1.1 源码
- 1.2 实际使用
- 1.3 效果
- 二、获取TableWidget中下拉框的下标
- 三、设置TableWidget中下拉框的下标
- 四、TableWidget中加入复选框
- 4.1 代码
- 4.2 效果
- 五、获取TableWidget中设置的复选框状态
- 注意事项
- 意见
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"
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(QAbstractltemView::Selectltems); 单元格选择
-
ui->tableInfo->setSelectionBehavior(QAbstractltemView::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详解
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);
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, 通过定义的名字就能找到控件
// 获取行列的widget
QWidget *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)));
最后的效果:
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)单元格设置一个下拉框,并设置初始下标为3
items << 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)单元格设置一个下拉框,并设置初始下标为2
items << 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;"});
//表格中添加Widget
ui->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 嵌套combox
QModelIndex modelindex = ui->tableWidget->indexAt(dynamic_cast<QWidget *>(comboBox->parent())->pos());
int row = modelindex.row();
int column = modelindex.column();
//XXXXXX 具体逻辑
}
意见
能用代理加载控件,最好用代理, 别用这种。
前期开发界面确实很快, 但后期写业务, 尤其是多个控件有联动关系的时候, 很麻烦