Qt Designer 和 Python 运行 函数分开 functions.py

Qt Designer and Python run a function in separate functions.py

我是 python 的新手。我在 QtDesigner 中设计了一个 GUI 并翻译了代码以使用它 python。因为如果我在 GUI 中更改某些内容,它会覆盖我的代码,所以我想为函数使用一个单独的文件。

代码应该 运行 在主要 window 显示之后,但我得到一个错误

Ui_MainWindow' object has no attribute 'fillContactList'

如果有人能帮助我,我将不胜感激。

import sys
import psycopg2
from PySide6 import (QtCore, QtWidgets, QtGui)
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
     QMetaObject, QObject, QPoint, QRect,
     QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
    QFont, QFontDatabase, QGradient, QIcon,
    QImage, QKeySequence, QLinearGradient, QPainter,
    QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QLabel, QMainWindow, QMenuBar,
    QSizePolicy, QStatusBar, QTabWidget, QWidget)

from mainwindow import Ui_MainWindow

class mainwindow(QMainWindow, Ui_MainWindow):

   def __init__(self):
       super(mainwindow, self).__init__()
       self.setWindowTitle("Skills In Motion")

   def fillContactList(self):
           conn = psycopg2.connect(database="CRM", user="********", password="*****", host="localhost", port=5432)
           cur = conn.cursor()
           dataset = cur.execute("SELECT cust_name, cust_pk FROM customer")
           results = cur.fetchall()
           
           rowPosition = 0
           for customers in results:
               self.contactsTable.insertRow(rowPosition)
               self.contactsTable.setItem(rowPosition,0,QtWidgets.QTableWidgetItem(customers[0]))
               self.contactsTable.setItem(rowPosition,1,QtWidgets.QTableWidgetItem(str(customers[1])))
               self.contactsTable.hideColumn(1)
               rowPosition = rowPosition+1
           self.contactsTable.itemSelectionChanged.connect(self.onSelectionContact)
           self.contactsTable.selectRow(0)

   if __name__ == "__main__":
       import sys
       app = QtWidgets.QApplication(sys.argv)
       MainWindow = QtWidgets.QMainWindow()
       ui = Ui_MainWindow()
       ui.setupUi(MainWindow)
       ui.fillContactList()
       MainWindow.show()
       sys.exit(app.exec())```

首先,您应该将 mainwindow class 重命名为 MainWindowMainWindow 仅需从 QMainWindow 进行子class。

创建 Ui_MainWindow 对象后,使用其 setupUi 方法构建您的 MainWindow 对象。 您在设计器中创建的所有小部件引用都将作为 Ui_MainWindow 对象的属性提供。

因此,将其作为 self.ui = Ui_MainWindow() 存储在 main window 中。将 main window 构建为 self.ui.setupUi(self)。引用任何小部件,例如 self.ui.contactsTable

您需要创建 MainWindow class 的对象,而不是 QMainWindow

这样试试:

import sys
from PySide6.QtWidgets import QMainWindow, QApplication
from mainwindow import Ui_MainWindow


class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.setWindowTitle("Skills In Motion")
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.fillContactList()

    def fillContactList(self):
        # Reference Table like this
        # self.ui.contactsTable
        pass


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())