我有一个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() 来实现的吗?
我有一个QTreeView子类(和QAbstractItemModel子类),它有一个很好的水平标题。我想添加垂直标题(从左侧向下)以匹配。但与QTableView具有单独的垂直 ( setVerticalHeader()) 和水平标题 ( setHorizontalHeader()) 不同的是,QTreeView只允许单个标题 ( setHeader())。
我知道我可以假装最左边的列是标题并使用不同的背景颜色呈现它(我不需要调整行大小或重新排列行的能力,所以我不必实现任何这些特殊行为)。但这并没有考虑到当地的风格。例如,在我的系统上,标题具有轻微的渐变,使它们具有近乎 3D 的外观。
因此,我正在寻找一种方法来添加适当的垂直标题(我猜它是 的子类QHeaderView),或者在最左侧的列中呈现标题,但以正确的方式呈现它。
我有一个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文档以寻找可能的修复方法,但找不到任何明显的内容。
我正在构建的工具使用工具提示在单击文件之前显示有关文件的额外信息。如果有人能够提供一些关于如何实现这一目标的见解,那就太好了。我使用 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) 我有一个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 个子行:
inst_idLEG_1LEG_2LEG_3beginInsertRows(SPREAD_1, 4, 4);我就是这样做的, …
在我的项目中,我使用 aQTreeView来显示绘图配置。在顶部,我有一个名为的根节点,PlotConfig其中包含多个绘图窗口。每个绘图窗口包含几个简单的 xy 绘图。
基本上,我有这样的东西:
我正在使用自己的QAbstractItemModel来显示此绘图配置。一切正常,但根节点PlotConfig确实分散了用户的注意力。
所以我想要这样的东西:
有没有办法禁止显示根节点?直接在QTreeView或在QAbstractItemModel. 我基本上想要的是QList每个条目都表现得像一棵树。
我正在实现一个基于 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()或其他方式让视图知道何时隐藏该行。
请分享您对执行此操作的最佳方式的想法。谢谢。
我希望在每个嵌套级别的左侧都QTreeView 没有缩进。我试过设置QTreeView::setIndentation(0)。它按照我的意愿删除了缩进,但它也隐藏了树箭头。
setIndentation(0):那么我怎样才能达到第三个例子中显示的结果呢?有没有做这件事的任何标准的方式,否则我将不得不重新实现QTreeView::paintEvent(),QTreeView::drawBranches()等等?
为了为小部件中的拖放错误创建测试用例,QTreeView我尝试模拟拖放鼠标移动行为。
我基本上选择了第一个元素QTreeView并希望将其拖放到第三个元素上。QTest::mousePress我通过使用和的组合来做到这一点QTest::mouseMove。最后当然应该有一个QTest::mouseRelease,但我已经无法复制 mousePress 和 mouseMove 了。
这些是重现所需的步骤:
如果按照描述执行这些操作,我可以看到小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) qtreeview ×10
qt ×8
c++ ×3
python ×2
model-view ×1
pyqt ×1
pyqt4 ×1
pyside ×1
qheaderview ×1
qmouseevent ×1
qt4 ×1
qt5 ×1
qtest ×1
qtwidgets ×1
tooltip ×1