【问题标题】:PyQt custom widget not showingPyQt 自定义小部件未显示
【发布时间】:2015-11-19 10:44:45
【问题描述】:

我是 PyQt 的新手。

我正在尝试将 QTableView 放入一个类中,这样我就可以在类中定义它的行为,而无需将其与所有其他代码混合,但是当我这样做时它就不会显示。

这是我正在学习的代码。它是从 [Edit table in pyqt using QAbstractTableModel] 借来的。稍微改编它以与 Qt5 一起使用并将 QTableView 移动到一个类中

import sys
from PyQt5 import QtGui, QtCore
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication, QVBoxLayout, QTableView, QWidget
from PyQt5.QtCore import *

# données à représenter
my_array = [['00','01','02'],
            ['10','11','12'],
            ['20','21','22']]

def main():
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

# création de la vue et du conteneur
class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        tablemodel = MyTableModel(my_array, self)
        table = Table(tablemodel)

        layout = QVBoxLayout(self)
        layout.addWidget(table)
        self.setLayout(layout)

# création du modèle

class Table(QWidget):
    def __init__(self, model):
        super().__init__()
        self.model = model
        self.initUI()

    def initUI(self):
        self.setMinimumSize(300,300)
        self.view = QTableView()
        self.view.setModel(self.model)


class MyTableModel(QAbstractTableModel):
    def __init__(self, datain, parent = None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.arraydata = datain

    def rowCount(self, parent):
        return len(self.arraydata)

    def columnCount(self, parent):
        return len(self.arraydata[0])

    def data(self, index, role):
        if not index.isValid():
            return None
        elif role != Qt.DisplayRole:
            return None
        return (self.arraydata[index.row()][index.column()])

    """
    def setData(self, index, value):
        self.arraydata[index.row()][index.column()] = value
        return True
    def flags(self, index):
        return Qt.ItemIsEditable
    """    

if __name__ == "__main__":
    main()

如果我删除类并使用

table = QTableView()
table.setModel(tablemodel)

表格显示没有问题。

我错过了什么?

【问题讨论】:

  • 你有没有试过返回不带tuple的数据(直接返回self.arraydata[row][column])?
  • 同样的结果。没有小部件显示。我只看到一个空白窗口。没有网格,没有标题。它是由 setMinimumSize(300,300) 定义的 300x300

标签: python qt widget pyqt5


【解决方案1】:

问题:table.view 没有父级。如果您将 self.view.show() 添加到 Table.initUi() 进行测试,您将获得两个小部件,MyWindow 与 tmoreau 所写的空表相同,table.view 作为独立小部件。

您可以在Table.initUi() 中构造table.view 时传递父级

self.view = QTableView(self) 

(那么您不需要布局)或将 table.view 添加到由 tmoreau 编写的布局中,Then the tableview is reparented.

去掉class也一样,然后tableview加入到layout中。

【讨论】:

    【解决方案2】:

    您将Table定义为QWidget,并带有属性self.view=QTableView。 但是您没有在Table 上定义布局,所以它将显示为一个空的小部件。

    您要么必须为Table 定义布局,并将视图添加到其中,要么直接将视图添加到主窗口的布局中:

    class MyWindow(QWidget):
        def __init__(self, *args):
            QWidget.__init__(self, *args)
    
            tablemodel = MyTableModel(my_array, self)
            table = Table(tablemodel)
    
            layout = QVBoxLayout(self)
            layout.addWidget(table.view)  #add view instead of table
            self.setLayout(layout)
    

    第三种方法是更改​​Table 的定义:您可以继承QTableView 而不是QWidget(代码未测试):

    class Table(QTableView):
        def __init__(self, model, parent):
            super(Table,self).__init__(parent)
            self.setMinimumSize(300,300)
            self.setModel(model) 
    

    【讨论】:

    • 谢谢。我现在看到了错误,这真的很愚蠢。真丢人!哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2013-05-08
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多