我在一个主窗口中创建了一个按钮,单击该按钮将调出带有树小部件的搜索窗口,该树小部件包含来自MySql数据库的数据行。如果要通过.py文件自己打开搜索窗口,它将显示数据,但是当我通过编程的按钮打开搜索窗口时,则不会显示任何数据。这是运行主窗口并创建按钮功能以打开搜索窗口的程序的代码:

from PyQt4 import QtGui
from MainMenu import Ui_MainWindow
from StudentSearch import Ui_Student_search
import DB_manager_students

class MainWindow(Ui_MainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.pushButton_3.clicked.connect(self.handleButton)
        self.window2 = None

    def handleButton(self):
        if self.window2 is None:
            self.window2 = Student_search()
            self.window2.show()

class Student_search(Ui_Student_search):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setupUi(self)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())


我究竟做错了什么?为何我自己打开而不显示时会显示数据呢?

编辑:

来自Student_search.py

class Ui_Student_search(QtGui.QWidget):
    def __init__(self, database, tableName):
        QtGui.QWidget.__init__(self)
        self.dbu = DB_manager_students.DatabaseUtility(database, tableName)
        self.setupUi(self)
        self.UpdateTree()

(...)

def UpdateTree(self):
    col = self.dbu.GetColumns()
    table = self.dbu.GetTable()

    for c in range(len(col)):
        self.StudentTreeWidget.headerItem().setText(c, col[c][0])

    self.StudentTreeWidget.clear()

    for item in range(len(table)):
        QtGui.QTreeWidgetItem(self.StudentTreeWidget)
        for value in range(len(table[item])):
            self.StudentTreeWidget.topLevelItem(item).setText(value, str(table[item][value]))


编辑:

最佳答案

这是您的基本小部件类

class Ui_Student_search(QtGui.QWidget):
    def __init__(self, database, tableName):
        QtGui.QWidget.__init__(self)
        self.dbu = DB_manager_students.DatabaseUtility(database, tableName)
        self.setupUi(self)
        self.UpdateTree()


实例化Ui_Student_search()时,Ui_Student_search.__init__()方法将运行,这将创建数据库实用程序,创建GUI并运行UpdateTree()

现在,您创建一个新类-Student_search-从Ui_Student_search类继承

class Student_search(Ui_Student_search):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setupUi(self)


但是,当实例化此类并运行Student_search.__init__()时,它仅完成Ui_Student_search.__init__()所做的一半事情。它不会创建数据库管理器或更新树。

您应该做的是调用父类__init__方法,以便Ui_Student_search.__init__()可以运行并执行所有这些操作。还要意识到,您需要将databasetablename参数传递给Ui_Student_search.__init__方法。

class Student_search(Ui_Student_search):

    def __init__(self, database, tablename, parent=None):
        Ui_Student_search.__init__(self, parent, database, tablename)


Python具有更简单的语法来调用基类的方法。

class Student_search(Ui_Student_search):

    def __init__(self, database, tablename, parent=None):
        super(Student_search, self).__init__(parent, database, tablename)


这也意味着您需要更新MainWindow以便将必要的构造方法参数提供给Student_search

def handleButton(self):
    if self.window2 is None:
        database = '???'
        tablename = 'xxx'
        self.window2 = Student_search(database, tablename, parent=self)
        self.window2.show()

10-08 08:46
查看更多