0

在拆分 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),但再次发生递归。今天九个小时加上三个星期前看别人,所以我真的很难过。其他人有些建议使用甚至是“内置”的配置文件,但这看起来很糟糕。

问候

4

2 回答 2

0

在 PyQt 中,类通常用于Signals在彼此之间进行通信,尤其是当一个类继承自该类QWidget而另一个类不继承自该类时,正如您通过连接信号所证明的那样(尽管是错误的,或者至少您缺少一些你的代码在这里)。

但是,您的insertRow() -> lineEdit方法永远不会被调用,因为它遵循一个return语句,这意味着该lineEdit部分永远不会被命中。但是,如果这解决了问题,我会感到惊讶。

另外,我会考虑从头开始重新设计(重构)您的代码。你有不同的Titles()班级真的有理由吗?

虽然这是无耻的自我推销,但我认为您可能会从我在 YouTube 上的课程中受益,该课程涉及使用 PySide(几乎与 PyQt 相同)构建 Python 应用程序 - 我讨论了跨线程(跨类)通信相当多 -链接是http://youtube.com/Deusdies2

于 2014-06-09T17:44:27.967 回答
0

您的代码有几个问题,但主要问题是代码段:

def insertRow(self):
     return self.insertRecord(-1, self.record())
     a.u.lineEdit.setText("Insert Title") 

如您所见,您在该行a.u.lineEdit.setText("Insert Title")被执行之前从函数返回。因此,此功能将永远不会更改您的QLineEdit.

更改您的代码 b

 def insertRow(self):
     a.u.lineEdit.setText("Insert Title")        # First change text.
     return self.insertRecord(-1, self.record()) # Then insert record and return.

另一方面:如果您正在使用全局变量(我不得不说这是一种不好的做法),为什么要将它作为参数传递?至少尝试不使用全局变量是绝对必要的。

于 2014-06-10T15:10:31.823 回答