详解Qt5.12.9属性表控件:QtPropertyBrowser的使用示例折叠展开小数位数QSS样式标题修改选中行号等

    科技2025-08-09  4

    一、简介

    Qt的属性表控件是比较常用的,在Qt设计师界面里可以看见它:

    QtPropertyBrowser控件是开源的:

    1、比较早期的版本(不再更新维护):

    https://github.com/qtproject/qt-solutions/tree/master/qtpropertybrowser

    但是它自带了很多的示例程序,可供学习,精彩不容错过:

    https://github.com/qtproject/qt-solutions/tree/master/qtpropertybrowser/examples

    2、官方持续更新的版本:

    https://github.com/qt/qttools/tree/dev/src/shared/qtpropertybrowser

     

    二、使用示例

    本人使用5.12.9版本的源码为例:

    https://github.com/qt/qttools/tree/5.12.9/src/shared/qtpropertybrowser

    从源码qtvariantproperty.cpp可以得到属性表支持的数据类型有以下:

    1、使用示例1,我们新建一个项目,拖入3个QWidget控件,提升为QtTreePropertyBrowser

    3个控件分别是:

    (1)简单属性表(不可编辑;键盘快捷键Ctrl+C可以复制选中行的Value

    (2)分组的属性表(不可编辑)

    (3)分组的属性表(可编辑)

    此外,该属性表,还支持折叠与展开,示例1的源码里面有实现。

     

    2、使用示例2,我们新建一个项目,再拖入3个QWidget控件,提升为QtButtonPropertyBrowser和QtGroupBoxPropertyBrowser

     

    三、常见问题之表头宽度怎么调整?

    转载自https://blog.csdn.net/xinyuelan/article/details/88706486

    QtTreePropertyBrowser的表头默认模式是QtTreePropertyBrowser::Stretch,表头是不允许动态调整大小的,如果属性名称比较长,就会出现“XXXXXX...”的情况。

    QtTreePropertyBrowser的表头属性有以下几种:

    QtTreePropertyBrowser::Interactive            //交互 QtTreePropertyBrowser::Fixed                  //固定 QtTreePropertyBrowser::ResizeToContents       //自动调整内容 QtTreePropertyBrowser::Stretch                //拉伸

    如何设置成可以通过鼠标动态的调整表头段的大小呢?

    方法1、设置QtTreePropertyBrowser对象模式为QtTreePropertyBrowser::ResizeToContents

    ui->widgetL->setResizeMode(QtTreePropertyBrowser::ResizeToContents);

    试试看,能否满足。如果不行,就尝试下面的方法2。

    方法2、设置QtTreePropertyBrowser对象模式为QtTreePropertyBrowser::Interactive

    ui->widgetL->setResizeMode(QtTreePropertyBrowser::Interactive); QtTreePropertyBrowser类自带一个可以指定表头大小的函数 QtTreePropertyBrowser::setSplitterPosition(int position),可以通过该函数设置表头的宽度,以适应Item的大小。但该函数仅能设定第一列,看原型函数,如下:

    void QtTreePropertyBrowser::setSplitterPosition(int position) {     d_ptr->m_treeWidget->header()->resizeSection(0, position); } 通过对函数 setSplitterPosition()的重载,实现可修改任一表头的宽度,代码如下:

    /** * @brief QtTreePropertyBrowser::setSplitterPosition修改表头宽度 - 新增 * @param index 表头索引 * @param position 表头宽度 */ void QtTreePropertyBrowser::setSplitterPosition(int index, int position) {     d_ptr->m_treeWidget->header()->resizeSection(index, position); }  在自己的cpp属性树初始化中,加入如下代码,可实现需求。

    //一次调频动作结果 m_pResultVarManager = new QtVariantPropertyManager(ui->result_property_tree); ui->widgetL->setResizeMode(QtTreePropertyBrowser::Interactive); ui->widgetL->setSplitterPosition(0, 235); ui->widgetL->setSplitterPosition(1, 170);

     

    四、常见问题之表格的标题怎么修改?

    QtPropertyBrowser里面的表格本质上是QTreeWidget。需要自己手动在类QtTreePropertyBrowser,新增成员函数,实现标题的修改:

    class QtTreePropertyBrowser : public QtAbstractPropertyBrowser { public: void setHeaderLabels(const QStringList &labels); } void QtTreePropertyBrowser::setHeaderLabels(const QStringList &labels) { d_ptr->m_treeWidget->setHeaderLabels(labels); }

    使用说明:

    //标题

    QStringList head; head << tr("轴号") << tr("坐标值(mm)");

    ui->widget->setHeaderLabels(head);

     

    五、常见问题之表格的选中单行的信号响应

    QtPropertyBrowser里面的表格本质上是QTreeWidget。鼠标单选每一行时,如何判断当前选中的是哪一行?

    通过信号QtTreePropertyBrowser::currentItemChanged来实现。

    //信号槽 connect(ui->widgetL, &QtTreePropertyBrowser::currentItemChanged, this, &FormProcessProofing::slotItemChangedL); void FormProcessProofing::slotItemChangedL(QtBrowserItem *item) { int index = -1; for (int i = 0; i < m_listPropL.size(); i++) { if (m_listPropL[i] == item->property()) { index = i; break; } } std::cout << index << endl; }

     

    六、常见问题之小数位数如何调整?

    QVariant::Double表格数值默认是2位小数,如何改变?

    源文件qtpropertymanager.cpp提供了接口函数

    /*!     \fn void QtDoublePropertyManager::setDecimals(QtProperty *property, int prec)     Sets the precision of the given \a property to \a prec.     The valid decimal range is 0-13. The default is 2.     \sa decimals() */ void QtDoublePropertyManager::setDecimals(QtProperty *property, int prec)

    QtVariantPropertyManager *pVarManager = new QtVariantPropertyManager(ui->widget); item = pVarManager->addProperty(QVariant::Double, QStringLiteral("浮点数据"));item->setAttribute(QLatin1String("decimals"), 5); item->setValue(3.1415926); ui->widget->addProperty(item);

    七、常见问题之折叠展开

    //折叠

    QtVariantPropertyManager *pVarManager = new QtVariantPropertyManager(ui->widget); QSet<QtProperty *> p = pVarManager->properties(); QList<QtBrowserItem *> list = ui->widget_2->items(groupItem); ui->widget_2->setExpanded(list.at(0), false);

     

    八、常见问题之QSS字体颜色

    表格里的文字颜色,其实就是对应QSS的QTreeWidget

    QTreeWidget{ background-color: #1d1f20; color:#386487; } QTreeWidget::item{ background: #1d1f20; }

     

    x、源码分享

    请下载完整的示例1源码:

    https://download.csdn.net/download/libaineu2004/12914683

    请下载完整的示例2源码:

    https://download.csdn.net/download/libaineu2004/12914790

     

     

    Processed: 0.008, SQL: 8