0

PyQt コードを分割するのに非常に問題があります:

main.py

(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)                   

titles.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 は行を挿入しますが、"a" がグローバルに定義されていないため、lineEdit を "Insert Title" に設定しません。ほとんどの場合、main.py の読み込み時にトリガーされる titles.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 が呼び出された後に定義され、main.Main をインポートすると再帰が作成されます。「from main import Main」を介して複数回継承し、「class Songs(Main)」を記述しようとしましたが (これにより、Songs は参照を渡さずに UI を使用できます)、再帰が発生します。今日の 9 時間と、他の人を見る前の 3 週間ということで、本当に困惑しています。' builtin 'の構成ファイルを使用することを推奨する人もいますが、それは非常に悪いようです。

よろしく

4

2 に答える 2

0

PyQt ではSignals、特に 1 つのクラスが継承し、もう 1 つのクラスQWidgetがそれを継承しない場合、シグナルを接続することで実証したように (間違っているか、少なくとも、あなたのコードはSOにあります)。

ただし、insertRow() -> lineEditメソッドはステートメントの後に続くため、このままでは呼び出されることはありません。returnつまり、そのlineEdit部分がヒットすることはありません。しかし、これで問題が解決したとしたら、私は驚くでしょう。

また、コードを根本から再設計 (リファクタリング) することを検討します。Titles()クラスが違う理由って本当にあるの?

これは恥知らずな自己宣伝ですが、PySide (PyQt とほぼ同じ) を使用して Python アプリケーションを構築することを扱う YouTube の私のコースから利益を得ることができると思います - クロススレッド (クロスクラス) 通信についてかなり議論します -リンクは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 に答える