QTreeView和QTreeWidget样式表的使用案例

2023-05-16

由于项目需要,第一次接触到QT样式表。主要是修改QTreeWidget(或者是QTreeView)的界面问题。官方的帮助文档其实起到很大的作用,网上的资料比较杂,而且普遍描述得不清楚。今天花了一些时间解决了项目中遇到的一些小问题,虽然都不是很严重的问题,但是对于刚刚接触Qt的新人而言,应该也算是有一点麻烦。

博主的项目环境:Ubuntu 14.04  64bit       Qt 4.8.6

从项目中剥离初一个简单的例子,总结一下今天解决的麻烦:

  1. qss文件的读取格式
  2. QTreeWidget项目的背景设置

最初,执行写好的qss文件总是达不到显示的效果,检索之后,有网友说是qss文件格式的问题,使用utf-8或者ASCII等,我使用的是ASCII。使用enca命令查看其文件格式即可,其实应该不是这个问题,如怀疑可能在读取文件的时候出错,使用下面的方式在读取文件的时候进行检测即可。

QFile file(":/styleSheet/styleSheet.qss");
    if(file.open(QFile::ReadOnly))
    {
        qApp->setStyleSheet(file.readAll());
        file.close();
        qDebug() << "Open File Successfully!!!";
    }
    else
        QMessageBox::about(NULL, "Test", "Open File Failed");

接下来就是样式表的设置,仅对几个比较隐蔽的问题进行说明。qss在很多地方借鉴了css,但是实现起来更简单。qss的注释支持" /* */",不支持“//",如果使用了"//"进行注释,可能导致该符号后面的样式表设置内容全部失效。

QTreeWidget{
    background-color: #5B677A;

    /* set the font properties*/
    font-size:17px;
    color: white;
}

上面的font-size设置的字体大小,color为字体颜色。

设置QTreeWidget样式表的时候,有的时候会发现会自动缩进,也就是鼠标hover到某个item的时候,item会自动”往前走一点“,解决这个问题的方式是,设置item的背景

QTreeWidget::item{
    margin:13px;
    background: #5B677A;
    background-clip: margin;
}

上面margin设置的效果是可以增大各个item的内容(content)之间的间隔,因为QTreeWidget是建立在Box Model之上的,这方面的内容,帮助文档有介绍,使用background-clip的原因也是如此,其值还可设置为border、padding、content,一般这三者的边界是重合的。这么设置纯粹是为了达到在我的项目中视觉效果的要求,具体的选则因人而异。


接下来要解决的问题就是图照片那个所示的橘红色的部分,因为这部分的显示与整体的颜色搭配不协调。顺便说一句,图中的"+"   "-" 还有那个笔记的图标,都是位于branch的位置,这是我在后面的内容中添加的,但是没有设计到去除橘红色部分的内容。其实只要理解了什么是branch,这个问题也很简单,只需修改branch的背景色即可

QTreeWidget::branch{
    background:#5B677A;
    }

其实,我们不设置QTreeWidget::branch的背景色以及QTreeWidget::item的背景色的话(当然,在后面也没有设置QTreeWidget::item:hover或者QTreeWidget:selected的前提下)每次选中的时候,整个一栏都是橘红色的,如下


设置QTreeWidget::item以及QTreeWidget::branch的目的只是为了进行背景覆盖。至此,这个小问题全部解决。

下面是示例代码,代码中的文件路径使用的是在Qt中新建的资源文件,这个比较简单,就不赘述了。

main.cpp

#include <QtGui/QApplication>
#include <QTreeWidget>
#include <QFile>
#include <QMainWindow>
#include <QDebug>
#include <QMessageBox>

int main(int argc, char * argv[])
{
    QApplication app(argc, argv);

    QFile file(":/styleSheet/styleSheet.qss");
    if(file.open(QFile::ReadOnly))
    {
        qApp->setStyleSheet(file.readAll());
        file.close();
        qDebug() << "Open File Successfully!!!";
    }
    else
        QMessageBox::about(NULL, "Test", "Open File Failed");


    QTreeWidget *treeWidget = new QTreeWidget;
     treeWidget->setColumnCount(1);
     QList<QTreeWidgetItem *> items;
     for (int i = 0; i < 2; ++i)
     {
         items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i))));
         for(int j=0; j <3; j++)
             items.at(i)->addChild(new QTreeWidgetItem(items.at(i), QStringList(QString("child: %1").arg(i))));
     }
     treeWidget->insertTopLevelItems(0, items);
     treeWidget->setHeaderHidden(true);
     treeWidget->resize(270, 390);
     treeWidget->show();

    return app.exec();
}
样式表styleSheet.qss

QTreeWidget{
    background-color: #5B677A;

    /* set the font properties*/
    font-size:17px;
    color: white;
}

QTreeWidget::item{
    margin:13px;
    background: #5B677A;
    background-clip: margin;
}


QTreeWidget::branch{
    background:#5B677A;
    }


QTreeView::item:hover {
    background: rgb(69, 187, 217);;
}

QTreeView::item:selected:active{
    background: rgb(63, 147, 168);
}

QTreeView::item:selected:!active {
    background: rgb(63, 147, 168);
}


QTreeWidget::branch:closed:has-children:!has-siblings,
QTreeWidget::branch:closed:has-children:has-siblings {
    border-image: none;
    image: url(:/image/plus.png);
}


QTreeWidget::branch:open:has-children:!has-siblings,
QTreeWidget::branch:open:has-children:has-siblings  {
    border-image: none;
    image: url(:/image/minus.png);
}

QTreeWidget::branch:!has-children:has-siblings:adjoins-item{
    border-image:none;
    image:url(:/image/test.png);
    }

QTreeWidget::branch:!has-children:!has-siblings:adjoins-item{
    border-image:none;
    image:url(:/image/test.png);
    }
样式表中image和border-image的区别:image填充的是content,而后者填充的是border,这还是Box Model中的内容

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QTreeView和QTreeWidget样式表的使用案例 的相关文章

  • 【Qt小白】QTreewidget添加连接线条 add connecting lines for branche

    QTreewidget光秃秃的 xff1f 想要像老式windows一样有连接线条 xff1f 看一下隐藏的很深的官网说明书 xff01
  • QTreeView和QTreeWidget样式表的使用案例

    由于项目需要 xff0c 第一次接触到QT样式表 主要是修改QTreeWidget xff08 或者是QTreeView xff09 的界面问题 官方的帮助文档其实起到很大的作用 xff0c 网上的资料比较杂 xff0c 而且普遍描述得不清
  • Qt QTreeWidget树形控件用法详解

    文章目录 QTreeWidget控件的创建QTreeWidget QTreeView的关系和区别QTreeWidgetItem类 QTreeWidget的实际应用1 添加结点2 给结点添加图标3 给结点添加复选框4 多列树形控件5 QTre
  • QTreeWidget

    文章目录 1 QTreeWidget1 1 QTreeWidget简介 1 QTreeWidget 1 1 QTreeWidget简介 在 Qt 中的树形控件称为 QTreeWidget xff0c 而控件里的树形节点称为 QTreeWid
  • 更改 QTreeView 的行背景颜色不起作用

    我有一个QTreeView并希望根据行的内容使用不同的背景颜色 为了实现这一目标 我导出了一个class MyTreeView from QTreeView并实现了paint方法如下 void MyTreeView drawRow QPai
  • Python:PyQt QTreeview 示例 - 选择

    我正在使用 Python 2 7 和 Qt 设计器 并且我是 MVC 新手 我在 Qt 中完成了一个视图 为我提供了目录树列表 以及用于运行事物的控制器 我的问题是 给定 Qtree 视图 选择目录后如何获取目录 代码快照如下 我怀疑它是
  • pyside qtreewidget 约束拖放

    我试图向 QTreeWidget 拖放功能添加约束 以防止分支进入另一个根中的另一个分支 这是一个让事情更清楚的例子 我有 4 个对象 我们称它们为苹果 香蕉 胡萝卜 榴莲 这棵树看起来像这样 isDelicious Root Backgr
  • QT QItemSelectionModel 忽略列?

    我试图将树的选择限制为特定列 我大量使用委托来创建自定义的每项每列行为 编辑器等 我希望我可以通过阻止事件或类似的事情从委托中以某种方式完成此操作 问题是 我认为我必须创建一个完全自定义的解决方案来模仿扩展选择 然而 经过大量搜索和很少的示
  • qt:pyqt:QTreeView内部拖放几乎可以工作...拖动的项目消失

    I almost在 QTreeView 中具有完全有效的拖放重新排序功能 一切似乎都很好 除了掉落的物体永远不会出现 尽管我可以通过多种不同的方式引用它 向我证明它确实存在于它应该在的地方 如果有人有时间可以运行以下代码并让我知道我做错了什
  • 何时从 QAbstractItemModel 发出 dataChanged

    在 Qt 中 我有一个模型子类化QAbstractItemModel 它是显示在 QTreeView 中的树 该模型支持各种形式的更改 并且都可以正常工作 相关的两个是 1 少量相关行中的部分数据发生变化 2 可视化更改意味着大多数行应更改
  • Qt:在数字字符串上使用 QSortFilterProxyModel 并获取错误的列文本时排序错误

    我有简单的模型视图树视图 带有 QSortFilterProxyModel 代理来对列进行排序 并使用 QStandardItemModel 作为模型在每列中都有字符串排序良好 但在包含数字 作为字符串 的列中排序错误 假设我有 9 12
  • 在 QTreeWidget 中调用上下文菜单

    当用户单击 QTreeWidgetItem 中的对象时 我想弹出一个菜单 我想从 QWidget 捕获信号 contextMenuRequested 然后使用 itemAt 从视图中检索索引 但这看起来不太漂亮 有没有更简单的方法可以调用视
  • 以“融合”风格从 QTreeView 中删除蓝色选择

    我有一个QTreeView带有定义选择的样式表 但是 当我使用 融合 样式时 装饰上方有一个额外的蓝色选择矩形 我尝试过使用show decoration selected 0 在样式表中 以及设置setAllColumnsShowFocu
  • QTreeWidget editItem 失败并显示“编辑:编辑失败”

    我有一个QTreeWidgetItem添加到QTreeWidget QTreeWidgetItem item new QTreeWidgetItem ui gt trwPairs item gt setFlags item gt flags
  • Qt 自定义模型需要做什么才能启用 drop?

    我正在尝试在我连接的自定义模型上启用拖放功能QTreeView 我做了以下事情 确保在上启用了acceptDropsQTreeView 在我的自定义模型上实现supportedDropActions to return Qt CopyAct
  • QAbstractItemModel 和 QTreeView [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要在 QtreeView 中显示
  • 在 QTreeView 中的文本之前显示图标

    I m using QtRuby with Qt 4 8 6 and trying to create a tree view where each item has a custom icon between the tree contr
  • 暂时抑制PyQt事件?

    我正在填充 QTreeWidget 的一个分支 然后将分支父级上的扩展属性设置为 true itemExpanded 信号会触发响应 这不是我想要的 有没有临时的方法来抑制或吸收一段代码期间的信号 您可以使用 QObject blockSi
  • QT:QFileSystemModel _q_fileSystemChanged 插槽在 UI 线程上执行,这与文档相矛盾

    我的 UI 使用 QTreeView 和 QFileSystemModel 来选择文件夹和文件 QFileSystemModel 的文档说文件结构更新是在单独的线程上完成的 这意味着 UI 不会被阻塞 然而 对我来说情况并非如此 我无法弄清
  • python 在单击的 QTreeview 项目复选框上发出信号已更改

    当树视图项目的复选框发生更改时 如何发出信号 import sys from PySide import QtGui QtCore class Browser QtGui QDialog def init self parent None

随机推荐