在拆分 PyQt 代码时遇到很多麻烦:
主文件
(PyQt modules)
from titles import *
appl = QApplication(sys.argv)
from main import Ui_MainWindow
class Main(QMainWindow):
def __init__(self, parent=None):
super(Main, self).__init__(parent)
QMainWindow.__init__(self)
self.u = Ui_MainWindow()
self.u.setupUi(self)
Titles(self)
标题.py
import sys
(PyQt modules)
(dbconnections)
class Titles():
def __init__(self, a): #<-- APP IS PASSED AS ARGUMENT AND NOW CALLED 'A'
a.u.table.setModel(titles)
a.u.lineEdit.setText("Titles Init")
a.u.add.clicked.connect(titles.insertRow)
class TitlesTableModel(QSqlTableModel):
def __init__(self):
QSqlTableModel.__init__(self)
self.setTable("titles")
self.setEditStrategy(self.OnFieldChange)
self.select()
def insertRow(self):
return self.insertRecord(-1, self.record())
a.u.lineEdit.setText("Insert Title")
titles = Titles()
运行 main.py 会加载所有数据。QPushButton 插入一行,但没有将 lineEdit 设置为“Insert Title”,因为“a”没有全局定义。主要尝试在titles.py中创建一个函数,在main.py加载时触发,如下所示:
a = 0 #<-- THIS WAS A LAST STRAW AS WARNED BY RESEARCHING OTHERS, BUT AM LOST
def start(app):
global a
a = app
Titles(a); TitlesTableModel(a) #<-- EVEN THOUGH TITLES.PY IS IMPORTED, IT DIDN'T INCLUDE THE APP REFERENCE, SO AM TRYING TO 'REFRESH' THE TITLESTABLEMODEL
...with Titles & TitlesTableModel requiring an extra argument (self, a)
这会加载数据和函数,但同样,insertRow 不会更新 lineEdit。
其他尝试将 Songs 类更改为
class Songs():
def __init__(self, a):
titles = Titles(a)
...(rest the same)
...并从模型定义下方删除titles=Titles()。这再次显示数据,但在按下“添加”时不会更新 lineEdit。
最终感觉titles.py需要有'from main import *',但是主应用程序实例是在titles.py被调用之后定义的,并且import main.Main会创建一个递归。尝试通过“从主导入主”继承多次,并编写“类 Songs(Main)”(因此 Songs 可以在不传递引用的情况下使用 UI),但再次发生递归。今天九个小时加上三个星期前看别人,所以我真的很难过。其他人有些建议使用甚至是“内置”的配置文件,但这看起来很糟糕。
问候