QTableWidget表格控件的用法(非常详细)

news2024/11/15 22:21:24

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 具体逻辑
 }

意见

能用代理加载控件,最好用代理, 别用这种。
前期开发界面确实很快, 但后期写业务, 尤其是多个控件有联动关系的时候, 很麻烦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LED灯内常见驱动电路

如今LED灯已成为照明的主流&#xff0c;使用白炽灯的家庭少之又少。其主要优势是LED灯更节能&#xff0c;相同光效的情况下&#xff0c;LED灯消耗的电能要比白炽灯减少70%以上。 LED灯的寿命比白炽灯要长&#xff0c;使用过白炽灯的人都知道&#xff0c;使用不了多长时间&…

简析Linux内核中的各种锁:信号量/互斥锁/读写锁/原子锁/自旋锁/内存屏障等

首先得搞清楚&#xff0c;不同锁的作用对象不同。 下面分别是作用于临界区、CPU、内存、cache 的各种锁的归纳&#xff1a; 一、atomic原子变量/spinlock自旋锁 — —CPU 既然是锁CPU&#xff0c;那就都是针对多核处理器或多CPU处理器。单核的话&#xff0c;只有发生中断会使…

生成C++工程的UML类图和类继承关系图

简介 在进行软件开发时&#xff0c;了解代码结构和关系、类之间的继承关系以及类内部的成员函数和变量定义是非常重要的。为此&#xff0c;我们可以使用Doxygen和Graphviz工具来生成UML类图和类集成关系图。 Doxygen是一个用于从注释的C源代码中生成文档的工具&#xff0c;支…

day01刷题记录

刷题 题目一分析题解 题目二分析题解 题目一 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。 例如: 一个队伍三个队员的水平值分别是…

access数据库连接sqlserver实现远程连接

由于项目需要对接生产系统&#xff0c;但是生产系统使用的是access数据库&#xff08;这么老还在用&#xff0c;不知道咋想的&#xff09;&#xff0c;客户又想把项目部署到阿里云上&#xff0c;需要阿里云远程连接本地的access数据库&#xff08;心里一句MMP送上&#xff09;&…

Java——线程池详细讲解

文章目录 一、线程池一、线程池基础1.1 什么是线程池1.2 为什么使用线程池1.3 线程池有哪些优势1.4 应用场景 二、线程池使用2.1 Java内置线程池 ThreadPoolExecutor2.1.1 线程池的七个参数2.1.1.1 **int corePoolSize 核心线程数量**2.1.1.2 int maximumPoolSize 最大线程数2.…

假期后,野兔百科系统网站源码新版更新发布

这个是野兔百科系统中文版更新&#xff0c;这次更新了增加几个功能模块&#xff0c;几个已知的问题&#xff0c;修复系统部分功能。 系统名称&#xff1a;野兔百科系统 系统语言&#xff1a;中文版 系统源码&#xff1a;不加密&#xff0c;开源 系统开发&#xff1a;PHPMySQL …

尚融宝29-提现和还款

目录 一、提现 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;前端 &#xff08;三&#xff09;后端 1、提现接口 2、回调接口 二、还款 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;前端 &#xff08;三&#xff09;后端 1、还款接口 …

第一章:概述

1&#xff0c;因特网概述 1.网络、互联网和英特网 网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。 多个网络还可以通过路由器互连起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网(或互连网)。因此&#xff0c;互联网是“网络的网络…

UE蓝图基础学习笔记(未完待续2023/05/03)

文章目录 一、项目创建1&#xff09;准备流程&#xff08;选择模板、开发语言、平台、质量等&#xff09;2&#xff09;界面介绍 二、Actor三、操作关卡对象&#xff08;旋转、移动、缩放和坐标轴&#xff09;四、常用快捷键五、运行游戏六、蓝图介绍七、蓝图节点八、操作事件图…

Azure DevOps Server 2022.0.1升级手册

Contents 1. 概述2. 操作方法 2.1 安装操作系统2.2 安装数据库2.4 还原数据2.3 安装和配置Azure DevOps Server 1. 概述 Azure DevOps Server 是微软公司经过20多年的持续开发&#xff0c;逐渐将需求管理、敏捷实践、源代码管理、持续集成等功能集成一体&#xff0c;实现应用软…

AutoHotKey简单入门

简单入门 快捷键 ^j::Send, Hello world! Return^j::代表CtrlJ&#xff0c;其中^代表Ctrl键 Send命令&#xff1a;在光标处输入Hello world! 也就是说&#xff0c;你按下CtrlJ后&#xff0c;将会输入字符串Hello world! Return即返回 热字串 ::ftw::Free the whales Ret…

抖音营销策略:新手如何利用抖音提高品牌曝光度

随着短规频平台的兴起&#xff0c;抖音作为其中的校佼者&#xff0c;已经成为了众多用户和企业的营销利器。但是&#xff0c;对于抖音新手而言&#xff0c;如何在这个平台上快速提升影响力呢?下面不若与众就为大家分享几个实用的方法。 一、关注抖音热门话题和潮流 抖音平台上…

力扣题库刷题笔记581-最短无序连续子数组

1、题目如下&#xff1a; 2、题解代码实现&#xff1a; 浅看题解&#xff0c;解题思路和本人接替思路一毛一样&#xff0c;奈何没有想到用双指针&#xff0c;在代码实现上也存在问题。当知道用双指针的时候&#xff0c;本题也变得相对简单。思路如下&#xff1a; a、输入仅存在…

Vue条件渲染v-if和v-show

条件渲染v-if和v-show <div id"root"><!-- <div v-if"true">v-if</div>--> <!-- <div v-show"true">v-show</div>--> n:{{n}}<button click"n">点击n</button><div v…

法规标准-UN R152标准解读

UN R152是做什么的&#xff1f; UN R152 全名为关于M1和N1型机动车高级紧急制动系统&#xff08;AEBS&#xff09;型式认证的统一规定&#xff0c;是联合国对于M1和N1型车辆AEBS系统认证的要求说明&#xff0c;当满足其要求内容时&#xff0c;才可通过联合国的认证&#xff0c…

数字化转型导师坚鹏:面向数字化转型的大数据顶层设计实践

面向数字化转型的大数据顶层设计实践 课程背景&#xff1a; 数字化背景下&#xff0c;很多企业存在以下问题&#xff1a; 不清楚大数据思维如何建立&#xff1f; 不清楚企业大数据分析方法&#xff1f; 不了解大数据应用成功案例&#xff1f; 课程特色&#xff1a; …

(转载)01.Matplotlib 图像结构-figure()axes设置

​概要&#xff1a;介绍matplotlib 绘制图像起手&#xff0c; figure() 的设置&#xff0c; axes() 的设置。主要的内容可移步最后部分的总结。 04 Matplotlib 总结 Matplotlib 提供了matplotlib.figure图形类模块&#xff0c;它包含了创建图形对象的方法。通过调用 pyplot 模…

Hive3面试基础

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、基本知识Hive31.表的类型和表的存储格式a)b)c)创建表i&#xff09;ii&#xff09; 2.表 二、使用步骤1.引入库2.读入数据 总结 前言 面试准备之Hive 回顾…

个人代码管理

项目描述&#xff1a; 在公司使用软件大家会经常使用GitLab进行代码管理&#xff0c;但是GitLab对于个人使用会有&#xff0c;操作相对复杂&#xff0c;且需要收费。GitHub的代码又都是开放的。经过上网查找和尝试&#xff0c;找到了一个可以日常用来保存自己代码的工具。&…