我从QAbstractItemModel派生来编码我自己的数据树,但QTreeView没有显示.
我看到类似问题的大多数答案都因为错误的变量生命周期而得到解决,所以这是我的模型分配代码:
ui.tvHierarchy->setModel(
new MetaHierarchyModel(
cutOffExtension(
fileName.toStdString()
)
)
);
Run Code Online (Sandbox Code Playgroud)
在构造时,模型使其根节点充满数据,然后根据需要加载更多数据(通过fetchMore).
我开始输出所有被调用的函数.这是调用序列的日志:
columnCount( QModelIndex(-1,-1,0x0,QObject(0x0) ) )
return 1
columnCount( QModelIndex(-1,-1,0x0,QObject(0x0) ) )
return 1
columnCount( QModelIndex(-1,-1,0x0,QObject(0x0) ) )
return 1
hasChildren( QModelIndex(-1,-1,0x0,QObject(0x0) ) )
return true
hasChildren( QModelIndex(-1,-1,0x0,QObject(0x0) ) )
return true
canFetchMore( QModelIndex(-1,-1,0x0,QObject(0x0) ) ))
return false
rowCount( QModelIndex(-1,-1,0x0,QObject(0x0) ) )
return 1
index( 0 , 0 , QModelIndex(-1,-1,0x0,QObject(0x0) ) )
return QModelIndex(0,0,0x987aa0,MetaHierarchyModel(0xa16970) )
hasChildren( QModelIndex(0,0,0x987aa0,MetaHierarchyModel(0xa16970) ) )
return true
columnCount( QModelIndex(-1,-1,0x0,QObject(0x0) ) )
return 1
parent( …Run Code Online (Sandbox Code Playgroud) 我正在用PySide编写我的第一个Qt应用程序,但在创建自定义树视图时遇到了一些麻烦.我想在一栏中列出我自己的数据.每个项目必须包含带有工具提示,不同文本颜色,不同背景颜色,带动作的图标和工具提示的文本.
默认树工作.我有观点:class TreeView(PySide.QtGui.QTreeView):
和型号:class TreeModel(PySide.QtCore.QAbstractItemModel):
如何在项目中添加不同的图标?
这是我的例子:
import sys
from PySide import QtGui, QtCore
#-------------------------------------------------------------------------------
# my test data
class MyData():
def __init__(self, txt, parent=None):
self.txt = txt
self.parent = parent
self.child = []
self.icon = None
self.index = None
#---------------------------------------------------------------------------
def position(self):
position = 0
if self.parent is not None:
count = 0
children = self.parent.child
for child in children:
if child == self:
position = count
break
count += 1
return position
#---------------------------------------------------------------------------
# test initialization …Run Code Online (Sandbox Code Playgroud) 我们通常这样在Qt中设置视图的模型:
view->setModel(model);
但是,有什么方法可以从视图中删除模型吗?我的意思是说,将视图保留为空,就像刚刚创建的那样,并且尚未设置任何模型。
如果您问我一个求婚的理由,那么我的情况与这个人的帖子非常相似。当第一个视图没有选择或者它是空的/无效的/什么的时候,我想让第二个视图从字面上什么都没有显示:没有标题,列,垃圾数据。在这种情况下,从视图中删除模型似乎非常合理。
我尝试了一个肮脏的技巧:
*view = QTableView();
但是Qt照顾了这些邪恶的东西,并将其operator=私有化。
我搜索了一段时间,但找不到满意的答案来解决我的问题。我需要在 QTreeView 中表示一个列表:
例子:
['.', ['A', 'B', 'C', 'D', 'E', 'F']], ['A', ['G', 'H']], ['A\\G', []], ['A\\H', ['K', 'L']], ['A\\G\\K', []], ['A\\G\\L', []], ['B', ['I', 'J']], ['B\\I', []], ['B\\J', []], ['C', []], ['D', []], ['E', []], ['F', ['M']], ['F\\M', []]
Run Code Online (Sandbox Code Playgroud)
应该这样表示:
.
|____A
|____H
|____G
|____K
|____L
|____B
|____I
|____J
|____C
|____D
|____E
|____F
|____M
Run Code Online (Sandbox Code Playgroud)
编辑:也许数据准备得不好。我也可以采用这种结构:
[".", "A", "A\\G", "A\\H", "A\\H\\K", "A\\H\\L", "B", "B\\I", "B\\J", "C", "D", "E", "F", "F\\M"]
Run Code Online (Sandbox Code Playgroud)
在控制台中可视化该结构不是问题,但我无法在树视图中得到正确的结果。这是我的节点类和我的 TreeModel
from PySide.QtCore import *
from PySide.QtGui import * …Run Code Online (Sandbox Code Playgroud) Stackoverflow 中的所有 Qt 模型/视图编程专家大家好。我正在从事的项目要求我为 XML 数据定义一个 QAbstractItemModel 派生模型。当我在实现这个模型的过程中遇到问题时,我之前在这里问过一个问题: QSortFilterProxyModel crashes when Delete a row from the source model via the source model function
该模型目前在应用程序中运行得很好,除了一些我不知道如何解决的性能问题。该应用程序的功能之一是通过设置 Max Num 和 Rand 编号来添加 Frame 元素 xml 节点。每个帧元素将具有分别从 0 到 MaxNum - 1 和 0 到 MaxRand-1 的 Num 和 Rand 编号。此外,我需要为 Rand=0 和 Rand=MaxRand-1 元素分别添加一个子参数元素。简要说明如下:
For Max Num=100, Max Rand=50
<Frame Num="0" Rand="0">
<Parameter Value="false"/>
</Frame>
<Frame Num="0" Rand="1"/>
<Frame Num="0" Rand="2"/>
...
<Frame Num="0" Rand="48"/>
<Frame Num="0" Rand="49">
<Parameter Value="true"/>
</Frame>
<Frame Num="1" …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Python中用QAbstractItemModel包装List,以允许我使用PyQt附带的GUI优点将列表视为树.确切地说,我正在使用PyQt5和Python 3.3.
我试图显式生成列表项的指针,但后来很难识别父项.我没有分配它们,我不确定在执行createIndex时PyQt是如何分配它们的.然后我决定重写代码以明确地识别使用索引(行值)访问的项目,例如给定嵌套列表["A",["a",[1,2,3]],"B", "C",["b",[4,5,6],"d"]]然后我可以使用[4,1,1]指向5,然后使用相同的列表减去最后一项来检索父项,[4,1].
我的问题是这个.当我从行值使用列表生成时,CREATEINDEX方法崩溃代码.我的最小破损示例(MBE)如下.在其中取消注释两行"return self.createIndex(row,col,ptr)"以查看我描述的分解.
from PyQt5.QtGui import QFont, QColor
from PyQt5.QtCore import QAbstractItemModel, QModelIndex, Qt, QAbstractListModel, QAbstractTableModel, QSize, QVariant
from PyQt5.QtWidgets import QApplication, QTreeView, QTableView, QListView
class NodeTree(QAbstractItemModel) :
def __init__(self,parent,data) :
super(NodeTree,self).__init__(parent)
self.data = data
def rowCount(self, parent = QModelIndex()) :
# int rowCount (self, QModelIndex parent = QModelIndex())
if parent.isValid() :
data = self.data
for idx in parent.internalPointer() :
data = data[idx]
return len(data)
else :
return len(self.data)
def columnCount(self, parent = QModelIndex()) :
# int …Run Code Online (Sandbox Code Playgroud) PySide文档包含有关树模型的QCompleter的这一部分:
PySide.QtGui.QCompleter可以在树模型中查找完成,假设任何项(或子项或子子项)可以通过指定项的路径明确地表示为字符串.然后一次完成一个级别的完成.
我们以用户输入文件系统路径为例.该模型是(分层的)PySide.QtGui.QFileSystemModel.路径中的每个元素都会完成.例如,如果当前文本是C:\ Wind,PySide.QtGui.QCompleter可能会建议Windows完成当前路径元素.同样,如果当前文本是C:\ Windows\Sy,PySide.QtGui.QCompleter可能会建议使用System.
为了实现这种完成,PySide.QtGui.QCompleter需要能够将路径拆分为在每个级别匹配的字符串列表.对于C:\ Windows\Sy,需要将其拆分为"C:","Windows"和"Sy".PySide.QtGui.QCompleter.splitPath()的默认实现,如果模型是PySide.QtGui.QFileSystemModel,则使用QDir.separator()拆分PySide.QtGui.QCompleter.completionPrefix().
要提供完成,PySide.QtGui.QCompleter需要知道索引的路径.这是由PySide.QtGui.QCompleter.pathFromIndex()提供的.PySide.QtGui.QCompleter.pathFromIndex()的默认实现返回列表模型的编辑角色的数据,如果模式是PySide.QtGui.QFileSystemModel,则返回绝对文件路径.
但我似乎无法找到一个展示如何做到这一点的例子.任何人都可以指出一个我可以用作起点的例子吗?(在我的调查中看起来似乎很难是树模型而不是QCompleter)
您似乎需要提供以下功能:
C:\Windows\Sy为['C:','Windows','Sy'] ['C:','Windows']我找到了QCompleter基本功能的一个例子,并且能够很好地调整基础知识(见下文),我只是不知道如何实现树模型类型的应用程序.
'''based on
http://codeprogress.com/python/libraries/pyqt/showPyQTExample.php?index=403&key=QCompleterQLineEdit'''
from PySide.QtGui import *
from PySide.QtCore import *
import sys
def main():
app = QApplication(sys.argv)
edit = QLineEdit()
strList = '''
Germany;Russia;France;
french fries;frizzy hair;fennel;fuzzball
frayed;fickle;Frobozz;fear;framing;frames
Franco-American;Frames;fancy;fire;frozen yogurt
football;fnord;foul;fowl;foo;bar;baz;quux
family;Fozzie Bear;flinch;fizzy;famous;fellow
friend;fog;foil;far;flower;flour;Florida
'''.replace('\n',';').split(";")
strList.sort(key=lambda s: s.lower())
completer = QCompleter(strList,edit)
completer.setCaseSensitivity(Qt.CaseInsensitive)
edit.setWindowTitle("PySide QLineEdit Auto Complete")
edit.setCompleter(completer)
edit.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud) 我正在 PySide 中为 Maya(3D 软件)构建一个工具,它可以自动版本并将文件保存在一个目录中。
过去几天我一直在尝试将我的初始 QTreeWidget 代码转换为带有 QTreeView 和 QAbstractItemModel 的模型/视图模式,以获取工具提示和其他功能,但我发现这比预期的要难。当我学习一种新的编码语言/技术时,我喜欢找到两个做同样事情的脚本——一个使用新技术,一个使用旧技术。这样我就可以比较和分解新代码正在做什么。
我最大的障碍是我很难找到一个 QTreeView 示例来完成我的 QTreeWidget 示例。此外,大多数示例手动填充 QTreeView 这对我也没有多大帮助。如果有人可以修改 QTreeView 代码,这样它就可以完成我的 QTreeWidget 代码所做的事情,那就太好了。对 QTreeView 最佳实践的评论也很棒!
我的 QTreeWidget 代码目前...
1) 从源获取字符串列表并将它们列在第一列中
2) 从每个字符串中获取日期并将其放在第二列中
QTreeView 代码:
from PySide import QtCore, QtGui
from shiboken import wrapInstance
import maya.OpenMayaUI as mui
import sys, os
def get_parent():
ptr = mui.MQtUtil.mainWindow()
return wrapInstance( long( ptr ), QtGui.QWidget )
################################################################################
class MyTree(QtGui.QMainWindow):
def __init__(self, parent=get_parent() ):
super(MyTree, self).__init__(parent)
data = MyData.init()
frame = QtGui.QFrame();
frame.setLayout( QtGui.QHBoxLayout() ); …Run Code Online (Sandbox Code Playgroud) 我想制作一个 TreeView,其中顶级条目跨越所有列(例如它们有一行),而子项跨越多个列(例如它们有多行。)
我试图用 QTreeView.setFirstColumnSpanned 来完成这个。但是,我真的不知道在何处/何时调用它(也许我一开始就完全错误。)
我想也许我可以在我的视图中创建一个函数,该函数将在视图填充后调用,以检查任何需要更新其跨度的项目。
但是,我找不到任何可以连接的信号来帮助我做到这一点(我尝试了几个,但似乎都没有触发。)
我还尝试在我的模型中重新实现 insertRows 和/或在我的视图中重新实现 rowsInserted,但它们似乎从未被调用过。
这是我正在做的极其简化的版本:
class MyModel(QtCore.QAbstractItemModel):
def __init__(self, top_level_nodes):
QtCore.QAbstractItemModel.__init__(self)
self.top_level_nodes = top_level_nodes
self.columns = 5
def columnCount(self, parent):
return self.columns
def rowCount(self, parent):
total = len(self.top_level_nodes)
for node in self.top_level_nodes:
total += len(node.subnodes)
return total
def data(self, index, role):
if not index.isValid():
return QtCore.QVariant()
if role == QtCore.Qt.DisplayRole:
obj = index.internalPointer()
return obj.name
return QtCore.QVariant()
def index(self, row, column, parent):
if not parent.isValid():
if row > (len(self.top_level_nodes) - 1):
return QtCore.QModelIndex() …Run Code Online (Sandbox Code Playgroud) 我希望我的AbstracttableModel子类data()方法返回html,即
PreText<b>Text</b>PostText
Run Code Online (Sandbox Code Playgroud)
并且此文本必须在html中显示为int表:PreText Text PostText
我怎样才能做到这一点?
qt qabstractitemmodel qabstracttablemodel qabstractlistmodel
使用 Qt 的“简单树模型示例”作为基础,下面从给定的字典构建 QTreeView 的大部分内容。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PySide2.QtWidgets import QApplication, QWidget, QGroupBox, QHBoxLayout, QVBoxLayout, QTreeView
from PySide2.QtCore import Qt, QAbstractItemModel, QModelIndex
class GUIWindow(QWidget):
def __init__(self, parent=None):
super(GUIWindow, self).__init__(parent)
""" Setup UI """
self.setWindowTitle("QTreeView from Dictionary")
groupbox_model = QGroupBox('TreeView') # Create a Group Box for the Model
hbox_model = QHBoxLayout() # Create a Horizontal layout for the Model
vbox = QVBoxLayout() # Create a Vertical layout for the Model Horizontal layout
tree_view …Run Code Online (Sandbox Code Playgroud)