我正在使用PyQt4,但这很通用,它可以适用于QT.
我有一系列QComboBoxes我从左到右填充(即选择最左边的项目将填充下一个项目.选择该项目中的项目将填充下一个项目,依此类推)
我无法在所有情况下触发信号(即无论当前索引是否发生变化,无论该项是由用户设置还是以编程方式设置).
更多详情:
QCombox每当选择一个项目时,我依靠第一个信号来触发,这样我就可以QCombobox在gui中填充下一个.然后我依靠那个QCombobox发出信号,以便我可以填充下一个信号.等等.
我想QCombobox根据用户与gui的最后一次交互预先选择每个项目.
我有一个独特的功能QCombobox,负责填充和预先选择QCombobox.代码看起来像这样:
comboBox1.blockSignals(True)
comboBox1.clear()
comboBox1.addItems(sorted(itemList))
comboBox1.blockSignals(False)
comboBox1.setCurrentIndex(intLastSavedState1)
Run Code Online (Sandbox Code Playgroud)
where intLastSavedState1是一个整数,该整数派生自用户上次使用该应用时最后选择的文本.我曾希望此函数的最后一行会触发一个信号,该信号会导致下一个组合框的功能加载并预先选择一个项目(comboBox2).然后,该操作将导致下一个comboBox's功能激活,并且它将级联到下一个和下一个.但它并不适用于所有情况.
我试过两个版本的信号:
self.connect(comboBox1, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.load_comboBox2)
Run Code Online (Sandbox Code Playgroud)
和
self.connect(comboBox1, QtCore.SIGNAL("activated(const QString&)"), self.load_comboBox2)
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,仅当信号intLastSavedState1与组合框中当前选择的内容不同时,才会触发信号.如果用户最后从该列表中选择了项目0,则会导致问题.在这种情况下QT,无法识别我的脚本将当前索引设置为0作为更改(因为在加载框后,它似乎认为它已经在索引0上),因此信号不会触发.
在第二种情况下,无论组合框中当前选择的内容如何,信号都将触发...但仅在用户激活时才会触发.当我的脚本尝试以编程方式设置当前索引时,它不会触发.
这些似乎是我关于信号的唯一两个选择.所以...是否有另一种预先选择项目的方式,QCombobox每次都会触发信号?
我使用PyQt使用QAbstractItemModel管理树视图.到目前为止,我已成功实现它,以便我可以加载数据,展开和折叠它,以及编辑值.
然而,我无法做的一件事是围绕插入和移除行.
我想做的简短版本:
当用户编辑特定单元格时,我需要实际删除对象层次结构中的基础项目并将其替换为另一个项目.我在我的模型的setData方法中实现它.因为我不完全理解我在做什么,所以我似乎已经将它设置为段错误.
基本上,我只需要更好地理解数据模型如何与QModelIndex交互,但阅读和重新阅读文档似乎并没有启发我.任何帮助(或指向一个体面的教程的任何链接 - 最好,但不一定,在python中 - 也将非常感激).
以下是我正在使用的代码示例:
#---------------------------------------------------------------------------
def setData(self, index, value, role=QtCore.Qt.EditRole):
"""
Sets the data.
"""
if index.isValid() and (0 <= index.row() < self.rowCount()):
item = index.internalPointer()
value = value.toString()
if index.column() == 5:
# rip out the current object and replace it with a new one of
# the correct datatype.
#next 4 lines get info from my underlying hierarchy of objects
dataType = str(value)
parent = item.get_parent()
name = item.get_name()
row = parent.get_row_of_child(name) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用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) 我有一个读取和写入数据文件的 PyQt 应用程序。我在每个写入的文件中包含一个“版本号”。这是一个简单的数字,类似于:1.2 或其他东西(主要版本和次要版本)。
我这样做是为了在将来的版本中更改这些数据文件的格式,然后只需检查文件内的版本即可正确解析它们。
我的问题是将此数字存储在应用程序本身内部的最佳实践是什么。即,我是否只是将应用程序版本号硬编码到负责读写文件的类中?或者我应该在应用程序的顶层存储某种对象/变量,并以某种方式从负责读取和写入这些文件的类访问它。如果是后者,我如何存储它以及如何访问它?
谢谢。
我希望能够展开或折叠 QTreeView 中特定分支的所有子级。我正在使用 PyQt4。
我知道 QTreeView 有一个绑定到 * 的展开所有子项功能,但我需要两件事:它需要绑定到不同的组合键(shift-space),而且我还需要能够折叠所有子项。
这是我到目前为止所尝试过的:我有一个 QTreeView 的子类,其中我正在检查 shift-space 键组合。我知道 QModelIndex 会让我使用“child”函数选择一个特定的子项,但这需要知道子项的数量。我可以通过查看内部指针来获取子级的计数,但这只能为我提供层次结构第一级的信息。如果我尝试使用递归,我可以获得一堆子计数,但随后我不知道如何将它们转换回有效的 QModelIndex。
这是一些代码:
def keyPressEvent(self, event):
"""
Capture key press events to handle:
- enable/disable
"""
#shift - space means toggle expanded/collapsed for all children
if (event.key() == QtCore.Qt.Key_Space and
event.modifiers() & QtCore.Qt.ShiftModifier):
expanded = self.isExpanded(self.selectedIndexes()[0])
for cellIndex in self.selectedIndexes():
if cellIndex.column() == 0: #only need to call it once per row
#I can get the actual object represented here
item = cellIndex.internalPointer() …Run Code Online (Sandbox Code Playgroud) 我正在使用 PyQt4 和 QTreeView (尽管这可以很容易地直接应用于 qt)。
现在有默认的键绑定,可以使用右箭头和左箭头控制分支的展开/折叠。不幸的是,这些绑定并不理想,我想禁用它们。我不知道该怎么做。有谁知道如何禁用(或重新分配)QTreeView 上的默认键绑定?
我不是专业的程序员,所以我的知识有很多漏洞(请多加注意)。
我已经在python 3.7中编写了一些库。但是现在我想从使用python 2.7的3D应用访问它们。它们所具有的唯一真正的3.7具体功能(据我目前所知)是configparser(相对于ConfigParser)和打印功能。
我通过捕获importerror然后加载2.7版本来处理configparser问题。
我试图通过将以下行添加到在3D应用程序中运行的脚本的顶部来处理打印功能:
from __future__ import print_function
Run Code Online (Sandbox Code Playgroud)
但是,当我导入一个具有python 3样式打印功能的模块时,会出现语法错误。但是,如果我from __future__在加载的模块中包含该语句,则一切正常。显然,我在这里遇到了我的知识极限。
这是我要导入的模块的完整代码(称为test.py):
import sys
def print_error():
print("AND THIS IS?", file=sys.stderr)
Run Code Online (Sandbox Code Playgroud)
这是3D应用程序(运行python 2.7)中的代码,该代码称为:
from __future__ import print_function
import sys
sys.path.append("/home/me/Documents/dev/")
print("WHY IS THIS NOT A SYNTAX ERROR?", file=sys.stderr)
from mylib import test
Run Code Online (Sandbox Code Playgroud)
运行此代码时,得到以下输出:
WHY IS THIS NOT A SYNTAX ERROR?
00:00:08 Traceback (most recent call last):
00:00:08 File "<string>", line 7, in <module>
00:00:08 File "/home/me/Documents/dev/mylib/test.py", line 4
00:00:08 print("AND THIS IS?", file=sys.stderr)
00:00:08 ^
00:00:08 SyntaxError: …Run Code Online (Sandbox Code Playgroud) pyqt ×5
qt ×5
qtreeview ×3
python ×2
signals ×2
insert ×1
key-bindings ×1
python-3.7 ×1
qcombobox ×1
version ×1