[英]"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))
但是,我在 .net 上搜索了相同的英文錯誤消息,並找到了一個屏幕截圖,盡管不是我上面的代碼造成的(從此頁面挖出: Python 已停止工作)。
那么對齊我的 QTableWidget 的 2 列的正確方法是什么(沒有錯誤並且沒有垂直對齊到頂部)? 這也是 PyQt5 中的錯誤嗎?
供您參考,我正在使用以下內容: Python 3.7.6
、 conda 4.8.2
pyqt 5.9.2 py37h6538335_2
。 對於列 alignment,我查看了這個以供參考: How to align all items in a column to center in QTableWidget
由於 python 和 PyQt 保持對對象的引用的方式,理論上每個視圖只能設置一個無父級和無引用的委托。
但是,雖然可以像這樣設置一個委托,但不應該這樣做:委托應始終具有持久引用或有效父級,因為視圖不擁有委托的所有權(請參閱所有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 對象時無論如何指定父對象是一個不錯的選擇。
在任何情況下,至少應始終使用上述方法之一。
你得到一個錯誤的 alignment 因為你只設置了水平alignment: use option.displayAlignment = Qt.AlignRight | Qt.AlignVCenter
option.displayAlignment = Qt.AlignRight | Qt.AlignVCenter
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.