簡體   English   中英

實例化 QStyledItemDelegate 的子類兩次時出現“Python 已停止工作”錯誤

[英]"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.6conda 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM