当前位置:   article > 正文

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

qtpropertybrowser

一、简介

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

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

转载自Qt5.10下QtTreePropertyBrowser的表头调整_xinyuelan的博客-CSDN博客

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,新增成员函数,实现标题的修改:

  1. class QtTreePropertyBrowser : public QtAbstractPropertyBrowser
  2. {
  3. public:
  4. void setHeaderLabels(const QStringList &labels);
  5. }
  6. void QtTreePropertyBrowser::setHeaderLabels(const QStringList &labels)
  7. {
  8. d_ptr->m_treeWidget->setHeaderLabels(labels);
  9. }

使用说明:

//标题

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

ui->widget->setHeaderLabels(head);

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

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

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

  1. //信号槽
  2. connect(ui->widgetL, &QtTreePropertyBrowser::currentItemChanged, this, &FormProcessProofing::slotItemChangedL);
  3. void FormProcessProofing::slotItemChangedL(QtBrowserItem *item)
  4. {
  5. int index = -1;
  6. for (int i = 0; i < m_listPropL.size(); i++)
  7. {
  8. if (m_listPropL[i] == item->property())
  9. {
  10. index = i;
  11. break;
  12. }
  13. }
  14. std::cout << index << endl;
  15. }

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

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

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

  1. /*!
  2.     \fn void QtDoublePropertyManager::setDecimals(QtProperty *property, int prec)
  3.     Sets the precision of the given \a property to \a prec.
  4.     The valid decimal range is 0-13. The default is 2.
  5.     \sa decimals()
  6. */
  7. 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

  1. QTreeWidget{
  2. background-color: #1d1f20;
  3. color:#386487;
  4. }
  5. QTreeWidget::item{
  6. background: #1d1f20;
  7. }

更详细的QSS

  1. QTreeView,QListView,QTableView,QTabWidget::pane{
  2. border:1px solid #C0DCF2;
  3. selection-background-color: #F9D699;
  4. selection-color:#386487;
  5. alternate-background-color:#DAEFFF;
  6. gridline-color:#C0DCF2;
  7. }
  8. QTreeWidget{
  9. background-color: #1d1f20;
  10. color:#386487;
  11. }
  12. QTreeWidget::item{
  13. background: #1d1f20;
  14. }
  15. QTreeView::branch:closed:has-children{
  16. margin:4px;
  17. border-image:url(:/qss/lightblue/branch_open.png);
  18. }
  19. QTreeView::branch:open:has-children{
  20. margin:4px;
  21. border-image:url(:/qss/lightblue/branch_close.png);
  22. }
  23. QTreeView,QListView,QTableView,QSplitter::handle,QTreeView::branch{
  24. background:#EAF7FF;
  25. }
  26. QTableView::item:selected,QListView::item:selected,QTreeView::item:selected{
  27. color:#386487;
  28. background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #DEF0FE,stop:1 #C0DEF6);
  29. }
  30. QTableView::item:hover,QListView::item:hover,QTreeView::item:hover,QHeaderView{
  31. color:#386487;
  32. background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #F2F9FF,stop:1 #DAEFFF);
  33. }
  34. QTableView::item,QListView::item,QTreeView::item{
  35. padding:1px;
  36. margin:0px;
  37. }
  38. QHeaderView::section,QTableCornerButton:section{
  39. padding:3px;
  40. margin:0px;
  41. color:#386487;
  42. border:1px solid #C0DCF2;
  43. border-left-width:0px;
  44. border-right-width:1px;
  45. border-top-width:0px;
  46. border-bottom-width:1px;
  47. background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #F2F9FF,stop:1 #DAEFFF);
  48. }

x、源码分享

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

QPropertyBrowserDemo.rar_qt5.12属性表-C++文档类资源-CSDN下载

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

QPropertyBrowserDemo_v2.rar_qt5.12属性表-C++文档类资源-CSDN下载

我的开源仓库:

libaineu2004/QPropertyBrowserDemo

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/115113?site
推荐阅读
相关标签
  

闽ICP备14008679号