向QTableView、QTreeView单元格插入窗体小部件的功能实现

Qt QTableView 表格内添加控件 文章目录Qt QTableView 表格内添加控件1. QItemDelegate2. setIndexWidget3. setIndexWidget + setLayout Qt QTableView 表格内添加控件 书接上回,之前写了怎么在表格的表头添加复选框,Qt QHeaderView 添加复选框_师从名剑山的博客-优快云博客。这次来写怎么给表格内添加控件。 往表格里添加控件主要有两种方法,第一种是使用代理,QItemDelegate,重载其createEditor这个函数,但是这个有个缺点,就是 阅读详情
AI摘要

本文档详细介绍了如何在QTableView中实现类似QTableWidget的setCellWidget功能,通过自定义代码动态创建和更新单元格内的QPushButton和QCheckBox。作者首先分析了QTableView的相关尺寸和对象,接着展示了创建和更新控件的函数实现,包括处理滚动条滚动和表头调整时的几何尺寸变化。最后,补充说明了QAbstractItemView的setIndexWidget函数可以更简洁地完成相同功能,并给出了使用示例。

目录

1.前言

2.问题的提出

3.预备知识说明

4.功能实现

4.1.说明

4.2.代码剖析

4.2.1.QTableView有关的几个尺寸及对象说明

4.2.2.createCtrl函数分析

4.2.2.updateCtlGeometry函数分析

4.2.3.setCellWndVisible函数分析

4.3.实现的完整效果

4.4.利用QAbstractItemView类的setIndexWidget函数实现


1.前言

我们知道:QTableWidget类有如下函数:

void QTableWidget::setCellWidget(int row, int column, QWidget *widget)

可以实现在指定的单元格插入窗体部件QWidget对象,如下代码:

setCellWidget(row, column, new QLineEdit);
setCellWidget(row, column + 1, new QTextEdit);

实现向第row行的column列和column+1列分别插入了一个QLineEdit和一个QTextEdit窗体小部件。

2.问题的提出

      公司现有代码是用QTableView实现的,改成QTableWidget比较麻烦或改为QTableWidget不能满足需求,但需要向QTableView的单元格插入窗体小部件,而QTableView貌似是没有QTableWidget类的setCellWidget类似函数的,如何实现?

补充说明:在写本篇博文的时候,我还不知道QAbstractItemView类有setIndexWidget函数实现了QTableWidget类的setCellWidget类似功能:

void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget)

 所以就写代码自己实现了向单元格插入窗体小部件功能,在第4.4节,我会详细说明该函数用法。(2022年12月1日补记)

3.预备知识说明

        因为QTableView是基于Qt的model/view framework框架的,所以读者要能看懂后面的功能点是如何实现的,需要具备Qt的model/view framework知识,即Qt的模型/视图框架知识。如果不懂这方面的知识,请在Qt Assistant 中输入Model/View Programming 学习了解。读者本机Qt安装目录下的Examples\Qt-XX.XX.XX\widgets\itemviews目录下有很多model/view framework的例子,可以进行自学了解,其中XX.XX.XX为Qt的版本号,如:5.14.1。

4.功能实现

4.1.说明

  • 限于篇幅的原因,后面的代码只贴出cpp文件代码,.h文件代码不贴出。
  • 如果读者想运行本例子,请自行根据cpp代码提取出.h文件的类声明和成员函数。
  • .cpp文件中的所有以m_开头的都是类的成员变量。
  • QtWidgetsApplication1是本例子的主程序。该类的m_pModel是CModel类型指针成员变量;m_vtBtnWnd、m_vtCheckBoxWnd都是类型为vector<QWidget*>容器;ui.tableView是QTableView类对象;m_nVertCurScrollValue是垂直滚动条滚动的当前值。

        为了给QTableView提供数据,必须实现一个模型即从QAbstractTableModel.类派生出自己的模型类来,模型类model.cpp代码如下:

#include "model.h"
CModel::CModel(QObject *parent)
	: QAbstractTableModel(parent)
{}

CModel::~CModel()
{}

QVariant CModel::data(const QModelIndex& index, int role/* = Qt::DisplayRole*/) const
{
	return QVariant();
}

// 作为例子,假想QTableView有2列
int CModel::columnCount(const QModelIndex& parent/* = QModelIndex()*/) const
{
	return 2;
}

// 作为例子,假想QTableView有88行
int CModel::rowCount(const QModelIndex& parent/* = QModelIndex()*/) const
{
	return 88;
}

QVariant CModel::headerData(int section, Qt::Orientation orientation, int role /*= Qt::DisplayRole*/) const
{
	if (orientation != Qt::Horizontal) // 作为例子演示,我们只关心表头是水平的情况
		return QVariant();

	if (role != Qt::DisplayRole)// 作为例子演示,我们只关心 Qt::DisplayRole
		return QVariant();

    // 构造列,第1列列名为"button";第2列列名为"checkbox"
	if(0 == section)
	 return "button";
	else if(1 == section)
		return "checkbox";

	return QVariant();
}

QtWidgetsApplication1.cpp实现如下: 

#include "QtWidgetsApplication1.h"
#include "model.h"
#include<QPushButton>
#include<QScrollBar>
#include<QCheckBox>
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    m_pModel = new CModel(this);
    ui.tableView->setModel(m_pModel);

    connect(ui.tableView->horizontalHeader(), &QHeaderView::sectionResized, this, &QtWidgetsApplication1::headerSectionResized);   
    connect(ui.tableView->verticalScrollBar(), &QScrollBar::valueChanged, this, &QtWidgetsApplication1::viewScroll);

    createCtrl();

}

QtWidgetsApplication1::~QtWidgetsApplication1()
{}

// 滚动条滚动
void QtWidgetsApplication1::viewScroll(int nValue)
{
    m_nVertCurScrollValue = nValue;
 
    updateCtlGeometry();
}

// 按住鼠标左键,拖动表头列和列之间的分割线,从而改变列宽
void QtWidgetsApplication1::headerSectionResized(int logicalIndex, int oldSize, int newSize)
{
    updateCtlGeometry();
}
void QtWidgetsApplication1::createCtrl()
{
    auto nRowCount = m_pModel->rowCount();
    auto nColCount = m_pModel->columnCount();

    auto lastAllRowsTotalHeight = 0; // 统计本行之前的所有行高度总和
    auto nHorHeaderHeight = ui.tableView->horizontalHeader()->height();   // 水平表头列高度
    auto nVerticalHeaderWidth = ui.tableView->verticalHeader()->width();  // 垂直表头列宽度
    auto nTableViewFrameWidth = ui.tableView->frameWidth();               // QTableView对象边框宽度

    auto vertHeaderAndFrameWidth = nVerticalHeaderWidth + nTableViewFrameWidth; // 垂直表头列宽度和QTableView对象边框宽度之和
    auto horzHeaderAndFrameWidth = nHorHeaderHeight + nTableViewFrameWidth;     // 水平表头列高度和QTableView对象边框宽度之和

    for (auto nRowIndex = 0; nRowIndex < nRowCount; ++nRowIndex)
    {
        auto qsText(QString("button%1").arg(nRowIndex));
        auto pBtnWnd = new QPushButton(qsText, ui.tableView);
        m_vtBtnWnd.push_back(pBtnWnd);

        qsText = (QString("checkbox%1").arg(nRowIndex));
        auto pCheckBoxWnd = new QCheckBox(qsText, ui.tableView);
        m_vtCheckBoxWnd.push_back(pCheckBoxWnd);

        auto nCurRowHeight = ui.tableView->rowHeight(nRowIndex);  // 当前行高
        if (0 != nRowIndex)
        {
            auto lastRowIndex = (nRowIndex - 1);
            lastAllRowsTotalHeight += ui.tableView->rowHeight(lastRowIndex); // 累计本行之前的所有行高的和

            pBtnWnd->setGeometry(vertHeaderAndFrameWidth,
                horzHeaderAndFrameWidth + lastAllRowsTotalHeight, ui.tableView->columnWidth(0),
                nCurRowHeight);

            pCheckBoxWnd->setGeometry(vertHeaderAndFrameWidth + ui.tableView->columnWidth(0),
                horzHeaderAndFrameWidth + lastAllRowsTotalHeight, ui.tableView->columnWidth(1),
                nCurRowHeight);
        }
        else// 第一行要单独处理,第一行没有上一行,即nRowIndex - 1不存在,是负值
        {
            pBtnWnd->setGeometry(vertHeaderAndFrameWidth, horzHeaderAndFrameWidth, ui.tableView->columnWidth(0), nCurRowHeight);
            pCheckBoxWnd->setGeometry(vertHeaderAndFrameWidth + ui.tableView->columnWidth(0), horzHeaderAndFrameWidth, ui.tableView->columnWidth(1), nCurRowHeight);
        }
    }
}

// 更新单元格窗体部件几何尺寸
void QtWidgetsApplication1::updateCtlGeometry()
{
    auto nRowCount = m_pModel->rowCount();

    auto lastAllRowsTotalHeight = 0; // 统计本行之前的所有行高度总和
    auto nHorHeaderHeight = ui.tableView->horizontalHeader()->height();   // 水平表头列高度
    auto nVerticalHeaderWidth = ui.tableView->verticalHeader()->width();  // 垂直表头列宽度
    auto nTableViewFrameWidth = ui.tableView->frameWidth();               // QTableView对象边框宽度

    auto vertHeaderAndFrameWidth = nVerticalHeaderWidth + nTableViewFrameWidth; // 垂直表头列宽度和QTableView对象边框宽度之和
    auto horzHeaderAndFrameWidth = nHorHeaderHeight + nTableViewFrameWidth;     // 水平表头列高度和QTableView对象边框宽度之和
    auto xPos = vertHeaderAndFrameWidth;
   
    // 滚动条没有达到最大值
    if (m_nVertCurScrollValue != ui.tableView->verticalScrollBar()->maximum())
    {
        for (auto nRowIndex = 0; nRowIndex < nRowCount; ++nRowIndex)
        {
            auto pBtnWnd = m_vtBtnWnd[nRowIndex];
            auto pCheckBoxWnd = m_vtCheckBoxWnd[nRowIndex];
            auto nCurRowHeight = ui.tableView->rowHeight(nRowIndex); // 当前行的高度
            int yPos;
            if (0 != nRowIndex)
            {
                auto lastRowIndex = (nRowIndex - 1);
                lastAllRowsTotalHeight += ui.tableView->rowHeight(lastRowIndex); // 统计本行之前的所有行的高度和

                /* m_nVertCurScrollValue值是以单元格高度为单位的,即每次垂直滚动距离是单元格倍数
                   当鼠标单击滚动条向下滚动时,需要扣减 m_nCurScrollValue * ui.tableView->rowHeight(nRowIndex)距离
                */
                yPos = horzHeaderAndFrameWidth + lastAllRowsTotalHeight - m_nVertCurScrollValue * ui.tableView->rowHeight(nRowIndex);
                pBtnWnd->setGeometry(xPos, yPos, ui.tableView->columnWidth(0), nCurRowHeight);

                // CheckBox的横坐标就是第1列QPushButton的x坐标再加上QPushButton的宽度
                pCheckBoxWnd->setGeometry(xPos + ui.tableView->columnWidth(0), yPos, ui.tableView->columnWidth(1), nCurRowHeight);
            }
            else // 第一行要单独处理,第一行没有上一行,即nRowIndex - 1不存在,是负值
            {
                yPos = horzHeaderAndFrameWidth - m_nVertCurScrollValue * ui.tableView->rowHeight(0);
                pBtnWnd->setGeometry(xPos, yPos, ui.tableView->columnWidth(0), nCurRowHeight);
                pCheckBoxWnd->setGeometry(xPos + ui.tableView->columnWidth(0), yPos, ui.tableView->columnWidth(1), nCurRowHeight);           
            }

            setCellWndVisible(pBtnWnd, pCheckBoxWnd, yPos, horzHeaderAndFrameWidth);
        } // end for
    }
    else // 拖动滚动条到达最大值要单独处理
    {
        auto nViewHeight = ui.tableView->viewport()->height();
        for (auto nRowIndex = nRowCount - 1; nRowIndex >= 0 ; --nRowIndex)
        {
            auto pBtnWnd = m_vtBtnWnd[nRowIndex];
            auto pCheckBoxWnd = m_vtCheckBoxWnd[nRowIndex];

            lastAllRowsTotalHeight += ui.tableView->rowHeight(nRowIndex);
            int yPos = nViewHeight + nHorHeaderHeight - lastAllRowsTotalHeight;
            pBtnWnd->setGeometry(xPos, yPos, ui.tableView->columnWidth(0),
                ui.tableView->rowHeight(nRowIndex));

            pCheckBoxWnd->setGeometry(xPos + ui.tableView->columnWidth(0), yPos, ui.tableView->columnWidth(1),
                ui.tableView->rowHeight(nRowIndex));

            setCellWndVisible(pBtnWnd, pCheckBoxWnd, yPos, horzHeaderAndFrameWidth);
        }
    }
}

// 设置单元格窗体部件的可见性
void QtWidgetsApplication1::setCellWndVisible(QWidget* pBtnWnd, QWidget* pCheckBoxWnd,
                                              int yPos, int nHorzHeaderAndFrameWidth)
{
    /* 如果单元格所在窗体部件的纵坐标比水平表头高度与QTableView的上边框之和还小,就隐藏
       窗体部件,防止向上拖动滚动条到最顶部时,最上面一行单元格所在窗体部件遮挡住水平表头
    */ 
    if (yPos < nHorzHeaderAndFrameWidth) 
    {
        pBtnWnd->hide();
        pCheckBoxWnd->hide();
    }
    else // 这种情况是:向下拖动滚动条时,最上面一行单元格所在窗体部件在水平表头下方,即没遮挡住水平表头
    {
        pBtnWnd->show();
        pCheckBoxWnd->show();
    }
}

void QtWidgetsApplication1::resizeEvent(QResizeEvent* event)
{
    QWidget::resizeEvent(event);

    updateCtlGeometry();
}

4.2.代码剖析

4.2.1.QTableView有关的几个尺寸及对象说明

 图1

QTableView类对象内部有个viewport对象,可通过如下代码获得:

ui.tableView->viewport();

 viewport对象在QTableView类对象中的位置如下蓝色方框所示:

图2 

 即viewport对象是QTableView类对象剔除边框、垂直表头、水平表头的区域。

4.2.2.createCtrl函数分析

第39行:模型m_pModel获取QTableView的有多少行。

第50~79行:每行的第1列创建一个QPushButton;每行的第2列创建一个QCheckBox。其思路是:

  • 根据QTableView的竖向表头列宽度和QTableView的边框宽(厚)度和单元格宽度(列宽)算出QPushButton、QCheckBox窗体部件的x坐标。
  • 根据QTableView的水平表头列宽度和QTableView的边框宽(厚)度和当前行之前的所有单元格行高总值算出QPushButton、QCheckBox窗体部件的y坐标。
  • 因为第1行没有上一行,即nRowIndex - 1不存在,是负值,所有第1行要单独处理。
  • 然后调用setGeometry函数设置QPushButton、QCheckBox窗体部件的位置和宽高,这样QPushButton、QCheckBox窗体部件正好在每行的每个单元格的位置上了。

结合图1,就能很好理解createCtrl函数的nHorHeaderHeight、nVerticalHeaderWidth、nTableViewFrameWidth的含义了。

4.2.2.updateCtlGeometry函数分析

updateCtlGeometry函数在垂直滚动条滚动、按住鼠标左键,拖动水平表头列和列之间的分割线,从而改变列宽、窗体大小变化时会被调用。该函数和createCtrl函数思想类似,但考虑了:

  • 垂直滚动条滚动的情况。m_nVertCurScrollValue值表示垂直滚动条当前的值,该值是以单元格高度为单位的,即每次垂直滚动条滚动的距离是单元格倍数。当鼠标单击滚动条向下滚动时,需要扣减 m_nCurScrollValue * ui.tableView->rowHeight(nRowIndex)距离,此时呈现的视觉效果是单元格及单元格内的QPushButton、QCheckButton向上移动。
    垂直滚动条滚动到最大值时要单独处理,处理代码如129~147行所示。如果不单独处理,则当滚动条达到最大位置时,则有可能出现:1)最后一行单元格和底部不是严格封合的,即留有空隙;2):最后一行不能完全显示。3):当改变窗体大小(如:最大化)时,单元格中的QPushButton、QCheckButton消失了。如下图所示:

图3

 图4

              垂直滚动条滚动到最大位置单独处理的思路是:通过获取QTableView的viewport()高度(参见图2),按照行索引从大到小并从viewport()的底部向上设置行单元格的QPushButton、QCheckButton位置及几何尺寸。

4.2.3.setCellWndVisible函数分析

setCellWndVisible函数设置单元格窗体部件的可见性。在向上滚动垂直滚动条滚动到最顶部时,有如下情况:

图5 

 可以看到,最上面第1行的单元格遮挡住水平表头了。该函数就是处理这种情况的,其思路是:

  • 如果单元格所在窗体部件的纵坐标比水平表头高度与QTableView的上边框之和还小,证明在水平表头上方靠近标题栏方向,就隐藏窗体部件,防止向上拖动滚动条到最顶部时,最上面一行单元格所在窗体部件遮挡住水平表头。
  • 而当向下拖动滚动条时,如果单元格所在窗体部件的纵坐标比水平表头高度与QTableView的上边框之和还大,则单元格所在窗体部件证明在水平表头的下方,就将其显示。

4.3.实现的完整效果

实现的完整效果如下:

图6 

4.4.利用QAbstractItemView类的setIndexWidget函数实现

       本小节是2022年12月1日补写的,前面章节是之前写的,在补写本节之前,我还不知道QAbstractItemView类有setIndexWidget函数实现了前几节的功能。

       因为QTreeView、QTableView是继承自QAbstractItemView类,所以QTreeView、QTableView类对象也能调用setIndexWidget函数,该函数声明如下:

void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget)

第1个参数是模型索引(注:模型索引涉及到了Qt的model/view framework框架,请自行查阅Qt帮助),你可以想象为就是一个单元格所在的行列索引号。如果该参数无效,例如是根节点索引时,则这个函数什么都不做。

第2个参数是单元格要插入的窗体部件。注意:窗体部件autoFillBackground 属性要设置为true,否则窗体背景色是透明的。如果在指定索引处的A窗体被后来的窗体B替换,则A窗体被删除,如下:


  setIndexWidget(index, new QLineEdit);
  ...
  setIndexWidget(index, new QTextEdit);

则QLineEdit会被删除。本函数仅仅能用来根据项的数据在可见区域显示一些静态内容,如果需要显示一些动态内容或者显示一个自定义的编辑框部件,需通过子类化QStyledItemDelegate类实现。如下代码可以实现上述同样(放在构造函数里)功能,且不需要updateCtlGeometry类似函数控制单元格窗体部件几何位置和尺寸。

void QtWidgetsApplication1::installWidget()
{
    auto nRowCount = m_pModel->rowCount();
    auto nColCount = m_pModel->columnCount();

    for (auto nRowIndx = 0; nRowIndx < nRowCount; ++nRowIndx)
    {
        auto modelIndx = m_pModel->index(nRowIndx, 0);
        QString qsText(QString("button%1").arg(nRowIndx));
        ui.tableView->setIndexWidget(modelIndx, new QPushButton(qsText, this));

        modelIndx = m_pModel->index(nRowIndx, 1);
        qsText = (QString("checkbox%1").arg(nRowIndx));
        ui.tableView->setIndexWidget(modelIndx, new QCheckBox(qsText, this));
    }
   
}

QTableView 实现在单元格添加下拉框 QComboBox 1)通过setIndexWidget方法实现 实现: 1)继承代理类,实现自定义代理,网上很多教程,这里不再赘叙; 2)更加方便的方法,使用接口: void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget); 其实QTableWidget的setCellWidget借口内部也是调用 setIndexWidget。 示例代码: Widget::Widget(QWidget *parent) : QW 阅读详情

相关推荐

QT QTreeView\QTreeWidget控件 使用详解

本文详细的介绍了QTreeView、QTreeWidget控件的各种操作,例如:新建界面、控件布局、设置列、设置宽高、设置列表头、设置复选框、设置图标、添加树、删除树、查找树、修改树、设置选中、树排序、事件、信号、槽函数、添加节点、默认选中、.h源文件、cpp源文件、其它文章等等操作。实际开发中,一个界面上可能包含十几个控件,手动调整它们的位置既费时又费力。布局管理器可以完成两件事:自动调整控件的位置,包括控件之间的间距、对齐等;

断点 2万+

【pyqt】tableWidget里的cellWidget使用信号与槽机制

【pyqt】tableWidget里的cellWidget使用信号与槽机制 添加cellWidget控件,并连接槽函数,并注册匿名控件对象 槽函数获取信号发送者 参考 其他方案 可以尝试使用代理,

Watson的博客 4683

PyQt5入门指南:从环境搭建到界面开发与打包部署

图形用户界面(GUI)是连接用户与程序逻辑的桥梁,其核心在于将复杂的操作封装为直观的交互元素,如按钮和文本框,从而提升软件的易用性和专业性。在Python生态中,PyQt5作为Qt框架的Python绑定,凭借其强大的功能、跨平台特性和与操作系统的深度集成,成为开发专业级桌面应用的首选。它基于信号与槽的通信机制,实现了界面与业务逻辑的高效解耦,并通过布局管理器、丰富的控件库以及样式表(QSS),支持开发者构建规整、美观且响应迅速的界面。对于涉及数据处理或网络请求的耗时任务,PyQt5的多线程支持能有效防止界面

weixin_33766168的博客 352

【Qt编程之Widgets模块】-003:tablewidget表格之setCellWidget在单元格中放置控件

setCellWidget:在单元格中放置控件。setStyleSheet:设置控件的样式。setItem:将文本放到单元格中。

随意的风的专栏 1412

《寻秦OL》.ani动画逆向解析:二进制结构与Unity重实现

动画文件格式是游戏资源逆向的核心入口,其本质是一组按特定规则组织的二进制数据流。理解魔数识别、字节序、字段对齐与差分编码等底层原理,是解析非标准格式的关键前提。技术价值在于绕过黑盒协议,直接从静态客户端提取可验证的原始语义;典型应用场景包括老游戏复刻、美术资产抢救、引擎跨平台迁移及教学级逆向训练。本文以《寻秦OL》的`.ani`文件为实例,深入剖析其C风格结构布局、GB2312中文命名、16位定点数旋转表示及帧主序差分存储机制,并基于C#在Unity中完成从字节流到AnimationClip的端到端重建,覆

weixin_30368981的博客 640

Pinocchio 安装教程|机器人学的必备库

安装pinocchio,不要安装pip3 install pinocchio!

darcsdn 1660

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第2种方法)

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第2种方法)

danshiming的博客 2873

踩坑记录:服务商模式下微信小程序支付,为什么必须用子商户的AppID获取openid?

本文深入解析了服务商模式下微信小程序支付必须使用子商户AppID获取openid的技术原因,详细对比了服务商模式与直连模式的关键差异,并提供了正确的配置指南和常见问题解决方案,帮助开发者避免微信支付集成中的常见陷阱。

weixin_28318011的博客 548

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第3种方法)

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第3种方法)

danshiming的博客 1543

[ROS] rviz 可视化工具

[ROS] rviz 可视化工具 摄像头没讲 文章目录[ROS] rviz 可视化工具1. todo2. todo*. 参考*. 问题解决*. rough 1. todo 2. todo *. 参考 *. 问题解决 *. rough roscore + rviz

weixin_37834269的博客 2050

Oracle恢复学习实战小结

     学习oracle10g 043课程有段时间了,前一两个星期学习了backup/restore相关的内容,刚好公司有要求要为host服务器做一个备用机以防止数据意外丢失。于是,实战开始了。     首先介绍host服务器架构。host以oracle数据库作为底层数据存储,以公司总部开发的Santorin作为应用,主要提供给测试台架数据存储、数据访问、数据导入导出、用户权限管理和数据自动备份

kseawolfk的专栏 1035

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第1种方法)

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第一种方法)

danshiming的博客 1784

CSP-J/S复赛文件组织与freopen读写全攻略,避免爆零

在信息学竞赛的上机考试中,代码能力固然重要,但文件组织与输入输出重定向往往是决定成败的关键细节。许多选手习惯在线评测环境,对本地文件命名、目录层级和读写方式缺乏系统认知,导致算法正确却因文件名拼写错误或freopen使用不当而遗憾失分。理解评测系统的工作原理,掌握从建立准考证号目录到规范命名源文件,再到使用freopen进行文件流重定向的标准流程,是每位参赛者的必备技能。这种工程化习惯不仅适用于CSP-J/S复赛,也是未来参加NOI等更高水平竞赛的基础。本文从文件组织的底层逻辑出发,结合实战案例,系统讲解考

weixin_32466193的博客 592

QTableWidget使用setCellWidget设置控件居中显示

最近在做一个大屏UI程序,需要直接在表格中展示多态进度条,也可以叫百分比进度条,就是一个进度条中包含了多种状态进度,用QProgressBar肯定是满足不了需求的,只能用上核武器:自定义控件,所谓心中有坐标,万物皆painter,犹如神笔马良,想怎么绘制就怎么绘制。 QTableWidget使用setCellWidget设置控件默认是塞满填充的,如果强制设置了控件的尺寸,则默认左上角开始放置,有时...

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 2万+

isaaclab无法识别NVIDIA显卡,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 1146

基于Simulink的H∞鲁棒控制器设计与仿真建模示例

本文介绍了基于Simulink的H∞鲁棒控制器设计与仿真方法。针对质量-弹簧-阻尼系统存在±50%刚度不确定性的问题,详细阐述了从构建广义被控对象、设计性能加权函数,到使用hinfsyn综合控制器的完整流程。通过Simulink仿真验证,所设计的H∞控制器在参数摄动和外部扰动下均保持良好性能,位移控制误差小于2%,扰动衰减超过20dB。相比传统PID控制,H∞方法展现出显著鲁棒性优势。文章还总结了工程实践中的加权函数调参技巧、控制器降阶方法,并展望了μ-综合等扩展方向,为处理系统不确定性提供了实用解决方案。

amy_mhd的博客 70

关于QTableWidget使用setCellWidget嵌入控件错位的问题

关于QTableWidget使用setCellWidget嵌入控件错位的问题一、发生现象 1.使用setCellWidget往QTableWidget界面插入数据 2. 使用滚动条翻页至最底部,在PushButton的槽处理函数中再使用setCellWidget往QTableWidget界面插入一条数据 1) 翻页到最底部

lichengcheng5945的博客 4885

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Qt编程之Widgets模块】-004:QTableWidget及基本操作

QTableWidget 是 Qt 中的表格组件类。在窗体上放置一个 QTableWidget 组件后,可以在 Property Editor 里对其进行属性设置,双击这个组件,可以打开一个编辑器,对其 Colum、Row 和 Item 进行编辑。表格的第 1 行称为行表头,用于设置每一列的标题,第 1 列称为列表头,可以设置其标题,但一般使用缺省的标题,即为行号。行表头和列表头一般是不可编辑的。除了行表头和列表头之外的表格区域是内容区,内容区是规则的网格状,如同一个二维数组,每个网格单元称为一个单元格。

随意的风的专栏 8085

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Qt下QTableWidget 基本用法

QTableWidget的基本设置 设置表头 ui->tableWidget->setColumnCount(11); ui->tableWidget->setRowCount(10); ui->tableWidget->setHorizontalHeaderLabels(QStringList() << “Id” << “Name” << “Unit” << “Value” << “Min” <<

huangdenan的博客 2631

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

QT中setIndexWidget方法无法在表格中显示控件的解决方法

QT实现表格个性化,加入了QPushButton或者QCheckBox或者QComboBox 这些控件但是一直无法显示。

白鱼儿的博客 2352

关于 QTableView添加控件使用setIndexWidget函数不显示对应控件 的解决方法

使用QTableView的时候,添加控件使用setIndexWidget不显示控件的解决方法

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 1万+

setIndexWidget

setIndexWidget是个好东西,但很多时候有问题,今天就遇到一个,因为表格行高太高了,有23,而createEditorContainer(i)的高度是20,所以看到表格中有一个Edit的框,于是干脆把Edit的框去掉,no border了,完美解决因为Edit框高度与表格高度不一样导致在表格列中看到框线。

zxbcollegestudent的专栏 672

pyqt QTableWidget控件表格操作

pyqt QTableWidget控件表格操作

雕刻刀 2891

【Qt开发笔记】QTableView中添加控件

QTableView中添加控件 方法描述: void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget); 例子: 添加一个QPushButton m_tableView->setIndexWidget(m_model->index(0, 1), new QPushButto...

专注Qt与C++开发 3156

PyQt5中向单元格添加控件的方法示例

在实际开发中,我们可以根据需要使用setCellWidget方法或setItem方法向单元格添加控件,以实现更加丰富的界面效果。最后,我们显示了表格控件。然后,我们创建了一个QPushButton控件,并使用setCellWidget方法将其添加到第一行第一列的单元格中。然后,我们创建了一个QPushButton控件,并使用setCellWidget方法将其添加到第一行第一列的单元格中。然后,我们创建了一个QCheckBox控件,并使用setCellWidget方法将其添加到第一行第一列的单元格中。

qq_20828765的博客 1196

QtabelView表中添加QComboBox小部件

最近在学习QT5的QTabelview,想要在QTabelview上做成下拉框的形式,查找资料发现有两种实现方式随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

weixin_47582800的博客 2839
上一篇: 利用QLineEdit的正则表达式校验器显示IP地址
下一篇: StarUML 及9种UML图
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值