我有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)
这使滚动条工作,但只有在我展开/折叠树视图项时.
我需要"每次"工作水平滚动条,从启动应用程序到结束.怎么组织起来?
谢谢.
我想使用自定义颜色(取决于与每行相关的数据)在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颜色角色).
我现在正在测试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) 我有一个从 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 导致测试应用程序崩溃。
我需要在QTreeView中实现通过drag-n-drop移动的行,并显示行之间的拖放指示符.我想知道是否有一种方法来覆盖指示器绘图,因此它仅显示行之间的所有层次结构(不是项目周围的矩形),该行必须与整行(而不是一列)一样宽).
我正在使用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)
我只想要双击事件.请帮助我如何阻止它进入单击事件插槽.谢谢.
我有一个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)
我想知道,这是什么责任函数?
我有一个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) 我有一个继承自 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() 来实现的吗?
当用户仅针对文件类型的列表中的项目/行单击图标时,如何触发图标的更改。树视图中的每一行都在 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)