"Python has stopped working" 两次实例化 QStyledItemDelegate 的子类时出错
"Python has stopped working" error when instantiating subclass of QStyledItemDelegate twice
我有以下代码来对齐 QTableWidget 列的文本。
import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QStyledItemDelegate
class AlignRightDelegate(QStyledItemDelegate):
def initStyleOption(self, option, index):
super(AlignRightDelegate, self).initStyleOption(option, index)
option.displayAlignment = Qt.AlignRight
class Table(QTableWidget):
def __init__(self, data, alignColumns = 1, *args):
QTableWidget.__init__(self, *args)
self.setRowCount(len(data))
self.setColumnCount(3)
self.setData(data)
self.resizeColumnsToContents()
for colIndex in range(1, 1 + alignColumns):
print("Align Column [", colIndex, "]", sep="")
self.setItemDelegateForColumn(colIndex, AlignRightDelegate())
def setData(self, data):
horizontalHeaders = []
for m, rowContent in enumerate(data):
for n, cellContent in enumerate(data[m]):
if (m == 0):
horizontalHeaders.append(cellContent)
else:
self.setItem(m - 1, n, QTableWidgetItem(cellContent))
self.setHorizontalHeaderLabels(horizontalHeaders)
if __name__ == "__main__":
data = [["col1", "col2", "col3"],
[ "1", "1", "a"],
[ "-1", "2", "b"],
[ "0", "3", "c"]]
print("python QTableWidgetAlignRight.py[ <AlignColumnCount=1]")
app = QApplication(sys.argv)
table = Table(data, int(sys.argv[1])) if (len(sys.argv) > 1) else Table(data)
table.show()
sys.exit(app.exec_())
如果我用python QTableWidgetAlignRight.py 1
执行上面的代码,它有点像,因为它应该如下所示col2对齐在右边但显然也在顶部:
然而,当我使用 python QTableWidgetAlignRight.py 2
执行相同的代码时,我尝试将 2 列向右对齐,我 运行 变成了 Python has stopped working error
。下面截图其实是我日文Windows OS (Win 10 Pro 20H2 (OS Build 19402.1165))
然而,我在网上搜索了相同的英文错误消息,并找到了一张屏幕截图,虽然不是我上面的代码(从这个页面挖出来的:)。
那么对齐我的 QTableWidget 的 2 列的正确方法是什么(没有错误并且没有垂直对齐到顶部)?这也是 PyQt5 中的错误吗?
为了您的信息,我正在使用以下内容:Python 3.7.6
、conda 4.8.2
、pyqt 5.9.2 py37h6538335_2
。对于列对齐,我参考了这个:How to align all items in a column to center in QTableWidget
由于 python 和 PyQt 保留对象引用的方式,只有 one unparented 和 unreferenced 委托理论上可以为每个视图设置。
但是,虽然可以像这样设置 one 委托,但不应该这样做:委托应始终具有持久引用或有效父级,因为视图 not 获得委托的所有权(请参阅所有 setItemDelegate*
函数的文档)。
此外,考虑到您对多个列使用相同的委托,创建多个列没有意义。
self.alignDelegate = AlignRightDelegate(self)
for colIndex in range(1, 1 + alignColumns):
print("Align Column [", colIndex, "]", sep="")
self.setItemDelegateForColumn(colIndex, self.alignDelegate)
请注意,您可以使用父参数 (self
) 或 创建实例属性:
self.alignDelegate = AlignRightDelegate()
# or
alignDelegate = AlignRightDelegate(self)
不过,同时使用两者不是问题,而且在处理 Qt 对象时指定父对象无论如何都是一个不错的选择。
在任何情况下,至少应始终使用上述方法之一。
你的对齐方式有误,因为你只设置了水平对齐方式:使用option.displayAlignment = Qt.AlignRight | Qt.AlignVCenter
.
我有以下代码来对齐 QTableWidget 列的文本。
import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QStyledItemDelegate
class AlignRightDelegate(QStyledItemDelegate):
def initStyleOption(self, option, index):
super(AlignRightDelegate, self).initStyleOption(option, index)
option.displayAlignment = Qt.AlignRight
class Table(QTableWidget):
def __init__(self, data, alignColumns = 1, *args):
QTableWidget.__init__(self, *args)
self.setRowCount(len(data))
self.setColumnCount(3)
self.setData(data)
self.resizeColumnsToContents()
for colIndex in range(1, 1 + alignColumns):
print("Align Column [", colIndex, "]", sep="")
self.setItemDelegateForColumn(colIndex, AlignRightDelegate())
def setData(self, data):
horizontalHeaders = []
for m, rowContent in enumerate(data):
for n, cellContent in enumerate(data[m]):
if (m == 0):
horizontalHeaders.append(cellContent)
else:
self.setItem(m - 1, n, QTableWidgetItem(cellContent))
self.setHorizontalHeaderLabels(horizontalHeaders)
if __name__ == "__main__":
data = [["col1", "col2", "col3"],
[ "1", "1", "a"],
[ "-1", "2", "b"],
[ "0", "3", "c"]]
print("python QTableWidgetAlignRight.py[ <AlignColumnCount=1]")
app = QApplication(sys.argv)
table = Table(data, int(sys.argv[1])) if (len(sys.argv) > 1) else Table(data)
table.show()
sys.exit(app.exec_())
如果我用python QTableWidgetAlignRight.py 1
执行上面的代码,它有点像,因为它应该如下所示col2对齐在右边但显然也在顶部:
然而,当我使用 python QTableWidgetAlignRight.py 2
执行相同的代码时,我尝试将 2 列向右对齐,我 运行 变成了 Python has stopped working error
。下面截图其实是我日文Windows OS (Win 10 Pro 20H2 (OS Build 19402.1165))
然而,我在网上搜索了相同的英文错误消息,并找到了一张屏幕截图,虽然不是我上面的代码(从这个页面挖出来的:
那么对齐我的 QTableWidget 的 2 列的正确方法是什么(没有错误并且没有垂直对齐到顶部)?这也是 PyQt5 中的错误吗?
为了您的信息,我正在使用以下内容:Python 3.7.6
、conda 4.8.2
、pyqt 5.9.2 py37h6538335_2
。对于列对齐,我参考了这个:How to align all items in a column to center in QTableWidget
由于 python 和 PyQt 保留对象引用的方式,只有 one unparented 和 unreferenced 委托理论上可以为每个视图设置。
但是,虽然可以像这样设置 one 委托,但不应该这样做:委托应始终具有持久引用或有效父级,因为视图 not 获得委托的所有权(请参阅所有 setItemDelegate*
函数的文档)。
此外,考虑到您对多个列使用相同的委托,创建多个列没有意义。
self.alignDelegate = AlignRightDelegate(self)
for colIndex in range(1, 1 + alignColumns):
print("Align Column [", colIndex, "]", sep="")
self.setItemDelegateForColumn(colIndex, self.alignDelegate)
请注意,您可以使用父参数 (self
) 或 创建实例属性:
self.alignDelegate = AlignRightDelegate()
# or
alignDelegate = AlignRightDelegate(self)
不过,同时使用两者不是问题,而且在处理 Qt 对象时指定父对象无论如何都是一个不错的选择。
在任何情况下,至少应始终使用上述方法之一。
你的对齐方式有误,因为你只设置了水平对齐方式:使用option.displayAlignment = Qt.AlignRight | Qt.AlignVCenter
.