向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

推荐系统在音乐领域的实践:网易云音乐推荐算法解析

你是否有过这样的经历?打开网易云音乐,“私人FM”里总能推到你想听的歌;“每日推荐”的歌单,往往藏着你没听过但一入耳就爱上的曲目。这些“懂你”的推荐背后,是一套复杂却精密的推荐系统在运转。问题陈述:音乐推荐的难点远超一般商品——音乐是高度主观的艺术,用户兴趣易随心情、场景变化;小众音乐的“长尾效应”显著,如何让冷门好歌被发现?传统协同过滤依赖历史行为,面对新用户/新歌曲的“冷启动”问题束手无策;而单纯的内容推荐又难以捕捉用户的隐性兴趣。核心方案:网易云音乐采用“混合推荐策略”——融合协同过滤(CF)

AI天才研究院 2086

Gem5模拟器,详解官网教程Event-driven programming(五)

Gem5模拟器,详解官网教程Event-driven programming、时间调度、如何自定义SimObject

qq_46675545的博客 2038

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

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

danshiming的博客 2873

别再死磕NFP了!用Python+遗传算法搞定异形件自动排版(附完整代码)

本文介绍了如何利用Python和遗传算法实现异形件智能排版,解决传统NFP方法计算复杂的问题。通过Shapely库处理几何运算和DEAP库搭建遗传算法框架,结合模拟退火策略避免局部最优,显著提升材料利用率。附完整代码和优化技巧,适用于服装裁剪、金属加工等行业。

weixin_26965807的博客 236

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

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

danshiming的博客 1543

手把手教你用TiggerRamDisk绕过iPhone/iPad激活锁(支持iOS16.3,Win/Mac双平台保姆级教程)

本文详细介绍了如何使用TiggerRamDisk工具绕过iPhone/iPad的激活锁,支持iOS16.3系统,并提供Windows和Mac双平台的保姆级教程。从工具准备、设备连接到核心解锁流程,一步步指导用户完成操作,帮助二手设备或旧设备重获新生。

weixin_29323493的博客 912

IFIX5.8在Win10系统下的安装避坑指南

本文提供了IFIX5.8在Windows 10系统下的详细安装教程与避坑指南。针对常见的驱动缺失、UAC拦截及兼容性报错等问题,文章从安装前准备、分步安装流程到安装后配置与驱动修复,给出了系统性的解决方案,帮助工控从业者顺利完成部署。

f6g7h8i9j的博客 364

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

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

danshiming的博客 1784

BMP280气压传感器原理图设计,已量产(压力传感器)

做嵌入式项目时,“小而精” 的传感器模块永远是刚需 —— 尤其是需要同时测气压和温度的场景,比如无人机定高、环境监测节点、穿戴设备等。最近捣鼓了一款 BMP280 的 Breakout 板,封装做得很紧凑,同时兼顾了稳定性和兼容性,这里单聊硬件设计细节。

不脱发的程序猿 300

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

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

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

软件可靠性测试与评价

本文系统介绍了软件可靠性工程的核心内容,包括可靠性概念、模型分类、测试方法和评价体系。重点解析了可靠性测试的三大步骤:定义运行剖面、设计测试用例和实施测试收集数据,并以智能安防系统为例说明具体应用。可靠性评价需结合业务场景,通过量化指标(MTBF、失效率等)和模型预测持续优化系统。文章强调可靠性需贯穿软件全生命周期,通过闭环反馈实现持续改进,为关键系统提供质量保障。

moton2017的博客 2050

手把手教你学Simulink--复杂环境适应的四足机器人领域仿真建模实例:构建一个基于Simulink的四足机器人动态平衡保持仿真模型

通过上述步骤,你可以构建一个基本的基于Simulink的四足机器人动态平衡保持仿真模型。此模型不仅有助于理解四足机器人在复杂环境中的动态平衡控制原理,也为进一步优化提供了基础。随着技术的发展,还可以探索更多高级功能,如自适应步态调整、强化学习等,以提高机器人的智能性和适应性。

MHD0815的博客 236

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

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

lichengcheng5945的博客 4885

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

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

随意的风的专栏 8085

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Qt下QTableWidget 基本用法

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

huangdenan的博客 2631

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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、付费专栏及课程。

余额充值