PyQt5 应用程序 Window 未显示

PyQt5 Application Window Not Showing

我正在尝试编写一个应用程序,允许用户查看标签 ID 列表及其描述,并允许用户勾选他们想要从中导入数据的每个标签 ID。在这一点上,我正在开发 UI 而已。

下面的代码有效并会显示应用程序 window,直到我添加 itemChanged 函数和连接。现在,当我 运行 这段代码时,只会显示新函数的打印语句。 window 永远不会显示,整个应用程序会立即退出(有关 运行ning 脚本的结果,请参见图片)。

此外,您会注意到我们得到了每种类型的项目的检查状态 - 我只想要标签 ID 的检查状态。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QTableView, QHeaderView, QVBoxLayout, QAbstractItemView
from PyQt5.QtCore import Qt, QSortFilterProxyModel
from PyQt5.QtGui import QStandardItemModel, QStandardItem

class myApp(QWidget):
    def __init__(self):
        super().__init__()

        self.resize(1000, 500)
        mainLayout = QVBoxLayout()
        
        tagIDs = ('Tag_1', 'Tag_2', 'Tag_3', 'Tag_4', 'Tag_5')
        descriptions = ('Description_1', 'Description_2', 'Description_3', 'Description_4', 'Description_5')


        model = QStandardItemModel(len(tagIDs), 2)
        model.itemChanged.connect(self.itemChanged)
        model.setHorizontalHeaderLabels(['Tag IDs', 'Description'])

        for i in range(len(tagIDs)):
            
            item1 = QStandardItem(tagIDs[i])
            item1.setCheckable(True)
            
            item2 = QStandardItem(descriptions[i])
            
            model.setItem(i, 0, item1)
            model.setItem(i, 1, item2)

        filterProxyModel = QSortFilterProxyModel()
        filterProxyModel.setSourceModel(model)
        filterProxyModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
        filterProxyModel.setFilterKeyColumn(1)
        

        searchField = QLineEdit()
        searchField.setStyleSheet('font-size: 20px; height: 30px')
        searchField.textChanged.connect(filterProxyModel.setFilterRegExp)
    
        mainLayout.addWidget(searchField)

        table = QTableView()
        table.setStyleSheet('font-size: 20px;')
        table.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
        table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)

        table.setModel(filterProxyModel)
        table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        
        mainLayout.addWidget(table)



        self.setLayout(mainLayout)

    def itemChanged(self, item):
        print("Item {!r} checkState: {}".format(item.text(), item.checkState()))


def main():
    
    app = QApplication(sys.argv)
    myAppControl = myApp()
    myAppControl.show()

    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

Header 取决于模型的设置 必须 始终在设置模型时设置。

在创建 table 之后或至少在 table.horizontalHeader().setSectionResizeMode 之前移动 table.setModel(filterProxyModel)(垂直 setSectionResizeMode() 对整个 header 并且不会引起问题)。