标签: qtreeview

QTreeView水平滚动条问题

我有QTreeView水平滚动条的问题,它没有出现.我已将水平滚动条策略设置为ScrollBarAsNeeded,但如果需要则不会显示.尝试将扩展和折叠信号连接到插槽:

connect(this, SIGNAL(expanded(QModelIndex)), this, SLOT(update_scroll_area(QModelIndex)));
connect(this, SIGNAL(collapsed(QModelIndex)), this, SLOT(update_scroll_area(QModelIndex)));
Run Code Online (Sandbox Code Playgroud)

该插槽由一行代码组成:

update_scroll_area(const QModelIndex& i)
{
    resizeColumnToContents(i.column());
}
Run Code Online (Sandbox Code Playgroud)

这使滚动条工作,但只有在我展开/折叠树视图项时.

我需要"每次"工作水平滚动条,从启动应用程序到结束.怎么组织起来?

谢谢.

qt horizontal-scrolling qtreeview

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

QTreeView中某些索引的自定义文本颜色

我想使用自定义颜色(取决于与每行相关的数据)在QTreeView小部件的其中一列中绘制文本.我试图重载drawRow()受保护的方法,并像这样更改样式选项参数(一个精简的示例):

virtual void drawRow(QPainter* p_painter, const QStyleOptionViewItem& option,
                     const QModelIndex& index) const
{
    QStyleOptionViewItem optionCustom = option;
    if (index.column() == 2)
    {
        optionCustom.palette.setColor(QPalette::Text, Qt::red);
    }
    QTreeView::drawRow(p_painter, optionCustom, index);
 }
Run Code Online (Sandbox Code Playgroud)

但显然我错过了一些东西,因为这似乎不起作用(我试图改变QPalette::WindowText颜色角色).

c++ qt qtreeview

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

QTreeView内存消耗

我现在正在测试QTreeView功能,我对此感到惊讶.似乎QTreeView内存消耗取决于项目数O_O.这是非常不寻常的,因为这种类型的模型视图容器仅跟踪正在显示的项目,其余项目在模型中.我编写了一个以下代码,其中包含一个不包含任何数据的简单模型,并且只报告它有1000万个项目.使用MFC,具有此类模型的Windows API或.NET树/列表将不占用内存,因为它将仅显示10-20个可见元素,并将在滚动/扩展项目时请求更多模型.但是使用Qt,这种简单的模型会导致约300Mb的内存消耗.越来越多的项目将增加内存消耗.也许任何人都可以暗示我做错了什么?:)

#include <QtGui/QApplication>
#include <QTreeView>
#include <QAbstractItemModel>

class CModel : public QAbstractItemModel
{
  public: QModelIndex index
  (
    int i_nRow,
    int i_nCol,
    const QModelIndex& i_oParent = QModelIndex()
  ) const
  {
    return createIndex( i_nRow, i_nCol, 0 );
  }

  public: QModelIndex parent
  (
    const QModelIndex& i_oInex
  ) const
  {
    return QModelIndex();
  }

  public: int rowCount
  (
    const QModelIndex& i_oParent = QModelIndex()
  ) const
  {
    return i_oParent.isValid() ? 0 : 1000 * 1000 * 10;
  }

  public: int columnCount
  (
    const QModelIndex& i_oParent …
Run Code Online (Sandbox Code Playgroud)

qt qtreeview

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

如何使用 QSortFilterProxyModel 过滤只显示子节点及其父节点的树模型?

我有一个从 QAbstractItemModel 派生的工作树模型,我希望使用 QSortFilterProxyModel 子类对其进行过滤,以仅显示某些条件的子节点。例如,我有以下树:

A
- B
-- C1
-- C1
-- C1
--- C2
- D
- E
Run Code Online (Sandbox Code Playgroud)

我想以节点具有 name == C1 的条件过滤这棵树,并仅显示具有 C1 的节点及其子节点,如下所示:

C1
C1
C1
- C2
Run Code Online (Sandbox Code Playgroud)

我已经有一个重新实现了 filterAcceptsRow() 的子类,它可以部分执行我想要的操作,但它仍然会显示 C1 节点的父节点和祖父节点:

A
- B
-- C1
-- C1
-- C1
--- C2
Run Code Online (Sandbox Code Playgroud)

我认为这是因为要考虑子节点,他们的父节点必须通过 filterAcceptsRow() 测试,对吗?我如何实现 filterAcceptRows() 或其他方法,以便它可以执行我所描述的操作?

我曾经在 qtcentre 和 qtforum 中问过这个问题,但没有得到任何有用的答复。我尝试在 filterAcceptsRow() 中直接使用 beginMoveRows 和 endMoveRows 移动 QSortFilterProxyModel 子类的索引,但由于危险的 const_cast 导致测试应用程序崩溃。

c++ qt model qtreeview

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

QTreeView绘制拖放指示器

我需要在QTreeView中实现通过drag-n-drop移动的行,并显示行之间的拖放指示符.我想知道是否有一种方法来覆盖指示器绘图,因此它仅显示行之间的所有层次结构(不是项目周围的矩形),该行必须与整行(而不是一列)一样宽).

qt indicator qtreeview

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

Qtreeview项目上的DoubleClick活动

我正在使用QTreeView来探索硬盘分区.在我的Qtreeview中,双击事件也会生成其treeview单击事件.

connect(ui->treeview,SIGNAL(doubleclicked(QModelIndex)),this,SLOT(Ondoubleclicktree(QModelIndex)));
connect(ui->treeview,SIGNAL(clicked(QModelIndex)),this,SLOT(Onclickedtree(QModelIndex)));
Run Code Online (Sandbox Code Playgroud)

我只想要双击事件.请帮助我如何阻止它进入单击事件插槽.谢谢.

c++ qt qtreeview

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

是否可以在QTreeView中隐藏一些列?

我有一个QTreeView模型,这个模型有四列,如下(Name,Size,Type,Data Modified).

我要的是删除(Size,Type,Data Modified)列,只留下这列名为Name.

QFileSystemModel *sysModel = new QFileSystemModel;
sysModel->setRootPath("");
sysModel->setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
ui->treeView->setModel(sysModel);
Run Code Online (Sandbox Code Playgroud)

我想知道,这是什么责任函数?

c++ qt qtreeview qt5

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

从"融合"样式中删除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 更改行上的图标 图标单击

当用户仅针对文件类型的列表中的项目/行单击图标时,如何触发图标的更改。树视图中的每一行都在 UserRole 中包含一个名为 TreeItem 的对象,该对象存储该项目是否被标记为收藏夹以及文件路径。

简而言之,有没有办法知道用户是否点击了装饰“图标”?

该工具只是递归地遍历一个目录并收集文件和文件夹。

class TreeItem(object):
    def __init__(self, filepath):
        self.filepath = filepath
        self.isFavorite = False
Run Code Online (Sandbox Code Playgroud)

Dropbox 图标链接

https://www.dropbox.com/s/3pt0ev2un7eoswh/file_off.svg?dl=0 https://www.dropbox.com/s/xext3m9d4atd3i6/file_on.svg?dl=0 https://www.dropbox。 com/s/6d750av0y77hq0g/folder.svg?dl=0

在此处输入图片说明

一定要更改目录路径进行测试

工具代码:

import sys
import os
from PySide import QtGui, QtCore, QtSvg

DIR_ICON_PATH = 'folder.svg'
FILE_ICON_OFF = 'file_off.svg'
FILE_ICON_ON = 'file_on.svg'

class TreeItem(object):
    def __init__(self, filepath):
        self.filepath = filepath
        self.isFavorite = False

class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):      
        # formatting
        self.resize(550, 400)
        self.setWindowTitle("Toychest")

        # widgets
        self.treeview = QtGui.QTreeView()
        self.treeview.setHeaderHidden(True)
        self.treeview.setUniformRowHeights(True)
        self.treeview.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        self.source_model = …
Run Code Online (Sandbox Code Playgroud)

python qtreeview pyside

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