我正在尝试使用PyQt连接到QTreeView的selectionChanged信号.我过去做过这个(对于QTableView)并且成功了.但现在我无法获得类似的代码.
在下面的代码示例中,我成功连接到展开和折叠的信号,但没有成功连接到selectionChanged或激活的信号.有人能告诉我我做错了什么吗?谢谢.
from PyQt4 import QtGui
from PyQt4 import QtCore
################################################################################
class ShaderDefTreeView(QtGui.QTreeView):
"""
Overrides the QTreeView to handle keypress events.
"""
#---------------------------------------------------------------------------
def __init__(self, parent=None):
"""
Constructor for the ShaderDefTreeView class.
"""
super(ShaderDefTreeView, self).__init__(parent)
#listen to the selectionChanged signal
print "Connecting"
#whenever the selection changes, let the data model know
self.connect(self,
QtCore.SIGNAL("selectionChanged(QItemSelection&, QItemSelection&)"),
self.store_current_selection)
self.connect(self, QtCore.SIGNAL("activated(const QModelIndex &)"),
self.activated)
self.connect(self, QtCore.SIGNAL("collapsed(const QModelIndex &)"),
self.collapsed)
self.connect(self, QtCore.SIGNAL("expanded(const QModelIndex &)"),
self.expanded)
#---------------------------------------------------------------------------
def store_current_selection(self, newSelection, oldSelection):
print "changed"
#self.model().selection_changed(newSelection)
#---------------------------------------------------------------------------
def …Run Code Online (Sandbox Code Playgroud) 我正在尝试为QTreeView实现QAbstractItemModel.我有插入行的问题.我注意到,如果我在我的应用程序的开头插入一切正常.但是如果我稍后插入行 - 在执行其他操作(如选择等)之后,新项目将保持不可见.而且QTreeView似乎根本不起作用!我是否必须发出一些信号来通知QTreeView有关行插入的信息?
这是我的插入方法:
bool LayersModel::insertRows(int position, int count, const QModelIndex & parent)
{
LayersModelItem * parentItem = getItem(parent);
if (position > parentItem->childCount())
return false;
beginInsertRows(parent,position,position+count-1);
bool result = true;
for (;count;--count)
result &= parentItem->insertChildren(position, new LayersModelItem());
endInsertRows();
return result;
}
Run Code Online (Sandbox Code Playgroud)
LayersModelItem是具有QList及其子项和数据的类.
我的项目的完整代码(需要KDE库)在这里:https: //github.com/coder89/PhotoFramesEditor/tree/v0.0.8 要查看问题,请在主窗口中选择一个蓝色项目,然后右键单击它,选择"删除项目".(这个方法在Canvas :: removeItems())并且它是完整的评论 - 我很绝望,我试图找到这个问题的原因...(事实上它不是删除任何东西 - 它添加了新项目).
感谢您的帮助和建议!
我的Qt /面试申请表有问题.我使用QTreeView来显示树数据.我基于QAbstractItemModel实现了自己的模型.
在应用程序崩溃之前我收到以下错误.它经常在我添加新记录后发生.
你能解释一下这个错误是什么意思吗?什么是QPersistentModelIndex?我在代码中没有使用QPersistentModelIndex.
ASSERT failure in QPersistentModelIndex::~QPersistentModelIndex: "persistent model indexes corrupted"
Run Code Online (Sandbox Code Playgroud)
谢谢.
有没有一种方法来获取和更改QTreeView中的活动行(不是QTreeWidget)?主动是指焦点突出显示的行,而不是选定的行。在paint事件中,我可以使用它QStyle.State_HasFocus来获得活动行,但这似乎在其他地方不起作用。
我正在尝试为树视图实现一个简单的模型,我无法弄清楚它为什么不起作用..似乎我的所有节点都是我的根节点的子节点,尽管它们中的三个应该是它的第一个孩子的子节点.此外,我可以看到我的hasChildren方法进入无限循环..任何帮助将不胜感激.
这是我的代码:
#!/usr/bin/env python2
from PySide import QtGui, QtCore
import sys
class SI(object):
children = []
def __init__(self, group=None, parent=None):
self.parent = parent
self.group = group
def data(self, column):
return self.group[column]
def appendChild(self, group):
self.children.append(SI(group, self))
def child(self, row):
return self.children[row]
def childrenCount(self):
return len(self.children)
def hasChildren(self):
if len(self.children) > 0 :
return True
return False
def row(self):
if self.parent:
return self.parent.children.index(self)
return 0
def columnCount(self):
return len(self.group)
class SM(QtCore.QAbstractItemModel):
root = SI(["First", "Second"]) …Run Code Online (Sandbox Code Playgroud) 我正在尝试QTreeView自动调整其内容的大小.这是我的设置:我想创建一个"智能"工具提示这是一个QWidget有Qt.Tool | Qt.FramelessWindowHint作为WindowFlags,这很好地工作.它包含一些布局,其中包含一些按钮(大小不变)和QTreeView.现在,无论何时将线条添加到QTreeView模型中,QTreeView都应自动增加其大小以避免垂直滚动条.
设置QSizePolicy.Expanding工具提示小部件和QTreeView没有改变任何东西 - 也许我在这里缺少一些额外的标志或东西.
我也试过以下,蛮力方法:
class ToolTip:
def __init__(self):
...
self.itemView.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)
self.itemView.verticalScrollBar().rangeChanged.connect(self.resizeViewVertically)
def resizeViewVertically(self, min, max):
self.resize(self.width(), self.height() + max)
Run Code Online (Sandbox Code Playgroud)
大部分时间都有效,但并非总是如此.每隔一段时间(每隔一段时间,确切地说,但我不知道这是否是巧合),使用此代码,视图正确调整大小(即所有内容都适合,并且不需要滚动条),但滚动条不会消失,允许滚动到最后一行下方的空白区域.
我有一个模特
class TreeModel : public QAbstractItemModel
Run Code Online (Sandbox Code Playgroud)
我填充了我的TreeItem排除列== 1的实例.在第1列中,我创建了CheckBoxes:
QVariant TreeModel::data(const QModelIndex &index, int role) const {
if (!index.isValid())
return QVariant();
if (role != Qt::DisplayRole) {
if (role == Qt::CheckStateRole) {
if (index.column() == 1) {
if (index.row() == 1) {
return Qt::Unchecked;
} else
return Qt::Checked;
}
}
return QVariant();
}
if (role == Qt::DisplayRole) {
if (index.column() != 1) {
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
return item->data(index.column());
}
}
return QVariant();
} …Run Code Online (Sandbox Code Playgroud) 我有一个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文档以寻找可能的修复方法,但找不到任何明显的内容。
我正在使用QSortFilterProxyModel为QTreeView实现增量搜索字段。搜索字段是QLineEdit,如下所示:
self.ui_search_lineedit.textEdited[unicode].connect(self._onSearchEdited)
Run Code Online (Sandbox Code Playgroud)
我的_onSearchEdited函数如下所示:
def _onSearchEdited(self, text):
self.proxy_model.setFilterFixedString(text)
self.ui_treeview.clearSelection()
Run Code Online (Sandbox Code Playgroud)
但是,如果我在树状视图中展开一个项目并进行搜索,则如果该项目不匹配,它将消失。当我删除搜索关键字以使其与该商品匹配时,该商品将再次显示,但已折叠。例如,如果我的项目是“ 410”,并且我已经将其展开;在搜索字段中输入“ 4100”,该项目将被隐藏;但是,如果我删除一个0以使搜索键为“ 410”,则该项目将会显示,但它已折叠。
有什么方法可以使该项目保持展开状态,除非用户手动折叠它?
我正在构建的工具使用工具提示在单击文件之前显示有关文件的额外信息。如果有人能够提供一些关于如何实现这一目标的见解,那就太好了。我使用 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)