标签: qtreeview

从"融合"样式中删除QTreeView中的蓝色选择

我有一个QTreeView定义选择的样式表.但是,当我使用"融合"样式时,装饰上还有一个额外的蓝色选择矩形:

蓝色选择矩形

我已尝试show-decoration-selected: 0;在样式表中使用,以及设置setAllColumnsShowFocus(false);,但无法让它消失.

有没有办法禁用或重新设置覆盖装饰器的选择部分?

作为参考,这是样式表:

QTreeView, QListView, QToolBar, QTableView
{
    show-decoration-selected: 0;
    background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,
                            stop: 0 #797979, stop: 0.2 #CCCCCC,
                            stop: 1.0 #FFFFFF);
    alternate-background-color: #333333;
    background-image: url(:/metal_scratched);
    outline: 0; /* removes focus rectangle*/
}

QTreeView::section, QListView::section, QToolBar::section, QTableView::section
{
    border: 1px solid black;
}

QTreeView::item:hover:enabled, QListView::item:hover:enabled, QToolBar::item:hover:enabled, QTableView::item:hover:enabled
{
    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                            stop: 0 transparent, stop: 0.4 rgba(150,150,150,0.5),
                            stop: 0.5 rgba(125,125,125,0.5), …
Run Code Online (Sandbox Code Playgroud)

c++ qt qtreeview qtstylesheets

6
推荐指数
1
解决办法
2765
查看次数

将图标分配给 QTreeView 中的项目

我有一个继承自 QTreeView 的类。我需要将图标分配给不同类型的文件和目录。这个问题给出了这个解决方案:

QVariant MyQFileSystemModel::data( const QModelIndex& index, int role ) const {
    if( role == Qt::DecorationRole )
    {
        QFileInfo info = MyQFileSystemModel::fileInfo(index);

        if(info.isFile())
        {
            if(info.suffix() == "dat")
                return QPixmap(":/icons/File_Icon.png");//I pick the icon depending on the extension
            else if(info.suffix() == "mcr")
                return QPixmap(":/icons/Region_Icon.png");
        }
    }
    return QFileSystemModel::data(index, role);
}
Run Code Online (Sandbox Code Playgroud)

我的类不是从 QFileSystemModel 继承,而是将其组合在一起,这意味着我无法覆盖该函数data()。从上面来看,图标将如何显示?是通过在构造函数中调用 data() 来实现的吗?

qt qtreeview

6
推荐指数
1
解决办法
1万
查看次数

向 QTreeView 添加垂直标题

我有一个QTreeView子类(和QAbstractItemModel子类),它有一个很好的水平标题。我想添加垂直标题(从左侧向下)以匹配。但与QTableView具有单独的垂直 ( setVerticalHeader()) 和水平标题 ( setHorizontalHeader()) 不同的是,QTreeView只允许单个标题 ( setHeader())。

我知道我可以假装最左边的列是标题并使用不同的背景颜色呈现它(我不需要调整行大小或重新排列行的能力,所以我不必实现任何这些特殊行为)。但这并没有考虑到当地的风格。例如,在我的系统上,标题具有轻微的渐变,使它们具有近乎 3D 的外观。

因此,我正在寻找一种方法来添加适当的垂直标题(我猜它是 的子类QHeaderView),或者在最左侧的列中呈现标题,但以正确的方式呈现它。

qt qt4 qtreeview qheaderview

5
推荐指数
1
解决办法
3374
查看次数

使用 QTreeView 行中的文本对齐方式错误

我有一个QTreeView(带有PyQt4),使用下面的代码自定义和调整大小的图标,但“大小”列显示错误的对齐/位置,如下所示:

在此输入图像描述

        self.ui.treeView.setIconSize(QtCore.QSize(30,30))

        fileSystemModel = QtGui.QFileSystemModel(self.ui.treeView)
        custonIconProvider = CustomIconsProvider()
        fileSystemModel.setIconProvider(custonIconProvider)

        self.ui.treeView.setModel(fileSystemModel)
        self.ui.treeView.setRootIndex(fileSystemModel.setRootPath(forlderPath))

        self.ui.treeView.setColumnWidth(0, 250)
        self.ui.treeView.setColumnWidth(1, 70)
        self.ui.treeView.setColumnWidth(2, 70)
Run Code Online (Sandbox Code Playgroud)

我已经搜索了http://pyqt.sourceforge.net/Docs/PyQt4/qtreeview.html文档以寻找可能的修复方法,但找不到任何明显的内容。

python pyqt text-alignment pyqt4 qtreeview

5
推荐指数
1
解决办法
1990
查看次数

PySide:即时工具提示(显示工具提示之前没有延迟)

我正在构建的工具使用工具提示在单击文件之前显示有关文件的额外信息。如果有人能够提供一些关于如何实现这一目标的见解,那就太好了。我使用 PySide 大约一个月了,所以我无法破译我在网上找到的这些高级示例/答案,因此带有一些注释的简单代码示例将对我有很大帮助。

这是我到目前为止所拥有的。我不知道在事件方面我在做什么,所以这是我可以用我拥有的代码示例做的最好的事情:

from PySide import QtCore, QtGui
from shiboken import wrapInstance
import maya.OpenMayaUI as mui

def get_parent():
    ptr = mui.MQtUtil.mainWindow()
    return wrapInstance( long( ptr ), QtGui.QWidget )   

############################################        
''' Classes '''
############################################
class Main_Window( QtGui.QDialog ):
    def __init__( self, parent=get_parent() ):
        super( Main_Window, self ).__init__( parent )

        self.setMouseTracking(True)                                      # Set tracking

        self.create_gui()
        self.create_layout()
        self.create_connections()
        self.get_contents()
        self.shapeItems = []


    #--------------------------------------------------------------------  # Mouse things
    def mouseMoveEvent(self, event):
        if (event.buttons() & QtCore.Qt.LeftButton):
            self.moveItemTo(event.pos())  

    #--------------------------------------------------------------------  # Mouse things
    def event(self, event):
        if …
Run Code Online (Sandbox Code Playgroud)

python tooltip qtreeview pyside

5
推荐指数
1
解决办法
4028
查看次数

Qt:在 QAbstractItemModel::beginInsertRows/endInsertRows 之后视图未更新

我有一个QAbstractItemModel派生模型附加到 QTreeView

我想以编程方式将单行附加到树层次结构中某处的节点。

从我的角度来看,我有一个连接到信号的插槽。信号发送QModelIndex我想要追加新行的节点的 。在我beginInsertRows(...)使用它QModelIndex新行的行号调用的插槽中,将新行附加到我的模型数据,然后调用endInsertRows()

传递给的值beginInsertRows(...)是父节点在追加新节点之前拥有的子行数。

也就是说,如果有 4 个子行,它们的行索引为 0、1、2 和 3。因此添加的新行号将为 4。

void Model::slotOnAddRow(QModelIndex parent, std::string key)
{
    assert(parent.isValid());
    Row& parent_row = *static_cast<Row*>(parent.internalPointer());

    beginInsertRows(parent, parent_row.numChildren(), parent_row.numChildren());

    parent_row.addChildRow(key);

    endInsertRows();
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是在调用endInsertRows()我的视图后没有更新。

例子:

这是我的树视图的示例。

在此处输入图片说明

设想:

  • 我想在SPREAD_1.
  • SPREAD_1 目前有 4 个子行:
    • 0 :inst_id
    • 1LEG_1
    • 2 :LEG_2
    • 3 :LEG_3
  • 因此,新行的行索引为4,所以我调用beginInsertRows(SPREAD_1, 4, 4);

我就是这样做的, …

c++ qt qtreeview qabstractitemmodel

5
推荐指数
1
解决办法
2618
查看次数

QTreeView 禁用根节点的显示

在我的项目中,我使用 aQTreeView来显示绘图配置。在顶部,我有一个名为的根节点,PlotConfig其中包含多个绘图窗口。每个绘图窗口包含几个简单的 xy 绘图。

基本上,我有这样的东西:

我的地块配置

我正在使用自己的QAbstractItemModel来显示此绘图配置。一切正常,但根节点PlotConfig确实分散了用户的注意力。

所以我想要这样的东西:

我想要的绘图配置

有没有办法禁止显示根节点?直接在QTreeView或在QAbstractItemModel. 我基本上想要的是QList每个条目都表现得像一棵树。

c++ qt qtreeview qabstractitemmodel

5
推荐指数
1
解决办法
3950
查看次数

如何标记要隐藏在 QAbstractItemModel 派生模型中的行

我正在实现一个基于 Qt 的树视图,其中视图是基于 QTreeView 的类,模型是基于 QAbstractItemModel 的类。这棵树应该有数百万个节点。我正在实现一种过滤机制,其中过滤掉的节点只是隐藏在树视图中。(我不想用QSortFilterProxyModel

模型的内部数据结构看起来有点像这样。

class MyTreeItem
{
 ...
 private:
      QList<MyTreeItem *> _children;
      bool                _isHidden;
 };

 class MyTreeModel : public QAbstractItemModel 
 {
  ...
  private:
       MyTreeItem * _rootNode;
  };
Run Code Online (Sandbox Code Playgroud)

我可以确定在填充模型数据结构时是否应过滤特定节点 (MyTreeItem*)。所以我想让 QTreeView 知道这个 item 应该在填充数据结构时隐藏,而不是再次遍历整个树并在填充后隐藏行。

老实说,我处于设计阶段,所以我没有任何真正的代码。我的要求是,在填充数据结构时,我将确定是否应该过滤当前节点,如果是,将设置标志_isHidden。但我不确定如何通过调用QTreeView::setRowHidden()或其他方式让视图知道何时隐藏该行。

请分享您对执行此操作的最佳方式的想法。谢谢。

qt qtreeview qabstractitemmodel model-view

5
推荐指数
1
解决办法
3611
查看次数

如何删除 QTreeView 缩进

我希望在每个嵌套级别的左侧都QTreeView 没有缩进。我试过设置QTreeView::setIndentation(0)。它按照我的意愿删除了缩进,但它也隐藏了树箭头。


默认行为:

  • 带压痕?
  • 带箭头?

默认行为


之后setIndentation(0)

  • 没有缩进?
  • 没有箭头?

在 setIndentation(0) 之后


期望的行为:

  • 没有缩进?
  • 带箭头?

期望的行为


那么我怎样才能达到第三个例子中显示的结果呢?有没有做这件事的任何标准的方式,否则我将不得不重新实现QTreeView::paintEvent()QTreeView::drawBranches()等等?

qt qtreeview qt5 qtwidgets

5
推荐指数
1
解决办法
1069
查看次数

如何使用 QTest 模拟拖放操作

为了为小部件中的拖放错误创建测试用例,QTreeView我尝试模拟拖放鼠标移动行为。

我基本上选择了第一个元素QTreeView并希望将其拖放到第三个元素上。QTest::mousePress我通过使用和的组合来做到这一点QTest::mouseMove。最后当然应该有一个QTest::mouseRelease,但我已经无法复制 mousePress 和 mouseMove 了。

这些是重现所需的步骤:

  1. 用户将鼠标移动到第一个项目的中心
  2. 用户按下鼠标左键
  3. 用户按住鼠标左键并将鼠标移动到第三个项目的中心
  4. 用户释放鼠标左键

如果按照描述执行这些操作,我可以看到小QTreeView部件会做出适当的反应,并指示特殊的突出显示和垂直线,以防项目在项目之间移动。

不幸的是,我的自动化测试未能重现这种行为。似乎按QTest::mousePress顺序调用会产生不同的效果。使用一对QTest::mousePressandQTest::mouseMove也是不同的。

这是我的代码:

主程序

#include "TestObject.h"
#include <QTest>

QTEST_MAIN(TestObject)
Run Code Online (Sandbox Code Playgroud)

测试对象.h

#include <QtTest/QtTest>

class TestObject : public QObject
{
    Q_OBJECT

private slots:
    void dragAndDrop();
};
Run Code Online (Sandbox Code Playgroud)

测试对象.cpp

#include "TestObject.h"
#include "TestObject.moc"
#include <QTest>
#include <QTreeView>
#include <QStandardItemModel>
#include <QPropertyAnimation>
#include "MouseMover.h"

void TestObject::dragAndDrop() {
    qDebug() << "Hello";
    QStandardItemModel model;
    QTreeView view;
    view.setModel(&model);
    view.show(); …
Run Code Online (Sandbox Code Playgroud)

qt qtreeview qstandarditemmodel qmouseevent qtest

5
推荐指数
1
解决办法
659
查看次数