1

編集:私は解決策を思いついた.それは私が思っていたよりもはるかに簡単だ. 上部の元のコードと質問。以下の「質問」の後の私の解決策..

from PyQt4 import QtGui, QtCore
from example_Ui import Ui_MainWindow
from filler_Ui import Form


class TabFiller(Form):
    def __init__(self, parent=None):
        Form.__init__(self, parent)

    def TabButtonClicked(self):
        print("Tab button pressed.")

    def LineEditChanged(self):
        print("LineEdit contents edited in tab page!")


class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

    tab_filler = [] # create empty list for tab contents
    tab_page = [] # create empty list for tab page
    tab_count = 0

    def CreateNewTab(self):
        tab_title = "New Tab : " + str(self.tab_count)
        self.tab_filler.append(TabFiller())
        self.tab_filler[self.tab_count].label.setText(tab_title)
        self.tab_page.append(self.tab_filler[self.tab_count])
        self.tabWidget.addTab(self.tab_page[self.tab_count], tab_title)
        self.tab_count += 1

    def MainButtonPressed(self):
        self.CreateNewTab()

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

MainWindow には、ボタンである QTabWidget が含まれています。clicked() シグナルは QtDesigner で定義されており、MainWindow クラス内の MainButtonPressed() 関数に送信されます。

フォーム ウィジェットも QTdesigner で作成されます。追加のタブ ページを埋めるために使用されます。これには、Button ウィジェットと LineEdit ウィジェットが含まれています。

質問

タブでどのウィジェットがクリックまたは編集されたかをどのように見分けることができるのか、頭に浮かびません。

各タブページはtab_pageというリストに保存されていることを知っています。

MainWindow クラス内で、現在アクティブなタブの特定のウィジェットの clicked() または finishedEditing() シグナルを受け取るにはどうすればよいですか?

解決策

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4 import QtGui
from example_Ui import Ui_MainWindow
from filler_Ui import Form

class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

    tab_index = 1 # 1 because we already made a default tab in QtDesigner

    def LineEditChanged(self):
        findWidget = self.tabWidget.widget(self.tabWidget.currentIndex()).findChildren(QtGui.QLineEdit, "lineEdit")
        if findWidget[0].isModified() == True:
            print("LineEdit contents edited in tab page!")
            print("Name of page edited :", "'", self.tabWidget.tabText(self.tabWidget.currentIndex()),"'")

    def TabButtonPressed(self):
        print("YOU DID IT!")
        print("Current Tab Index = ", self.tabWidget.currentIndex())

    def CreateNewTab(self, tabNum):
        tab_title = "New Tab : " + str(self.tab_index)
        self.tabWidget.addTab(Form(), tab_title)

    def MainButtonPressed(self):
        self.CreateNewTab(self.tab_index)
        findWidget = self.tabWidget.widget(self.tab_index).findChildren(QtGui.QPushButton, "tabButton")
        findWidget[0].clicked.connect(self.TabButtonPressed)
        findWidget = self.tabWidget.widget(self.tab_index).findChildren(QtGui.QLineEdit, "lineEdit")
        findWidget[0].editingFinished.connect(self.LineEditChanged)
        self.tab_index += 1

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

これを使用すると、各タブ ページ オブジェクトをリストに格納する必要がなくなります。基本的に、QTabWidget を使用してページのインデックスを作成します。

誰かがこれよりもエレガントな方法を持っている場合は、お知らせください;)

4

1 に答える 1

2

編集した質問で概説したように、QTabWidget を使用して動的に作成された各タブ ページを「インデックス化」するという解決策を見つけました。

QtDesigner では、1 つの QTabWidget と 1 つのボタンを備えたメイン ウィンドウを作成しました。 ここに画像の説明を入力

そのためのオブジェクト ツリーを次に示します。

ここに画像の説明を入力

注: 「Click Me!」の信号/スロットを追加しました。そのボタンがクリックされると、MainButtonPressed関数が呼び出されるように、QtDesigner のボタン。

タブ ページを埋めるために、QtDesigner でボタンと QLineEdit ウィジェットを含むフォームも作成しました。 ここに画像の説明を入力

そしてそのためのオブジェクトツリー。

ここに画像の説明を入力

ここでコードを再現します。注:上記のfindChildrenではなくfindChildを使用するように、この回答を更新しました:

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4 import QtGui
from example_Ui import Ui_MainWindow
from filler_Ui import Form

class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

    tab_index = 1 # 1 because we already made a default tab in QtDesigner

    def LineEditChanged(self):
        findWidget = self.tabWidget.widget(self.tabWidget.currentIndex()).findChild(QtGui.QLineEdit, "lineEdit")
        if findWidget.isModified() == True:
            print("LineEdit contents edited in tab page!")
        print("Name of page edited :", "'", self.tabWidget.tabText(self.tabWidget.currentIndex()),"'")

    def TabButtonPressed(self):
        print("YOU DID IT!")
        print("Current Tab Index = ", self.tabWidget.currentIndex())

    def CreateNewTab(self, tabNum):
        tab_title = "New Tab : " + str(self.tab_index)
        self.tabWidget.addTab(Form(), tab_title)

    def MainButtonPressed(self):
        self.CreateNewTab(self.tab_index)
        findWidget = self.tabWidget.widget(self.tab_index).findChild(QtGui.QPushButton, "tabButton")
        findWidget.clicked.connect(self.TabButtonPressed)
        findWidget = self.tabWidget.widget(self.tab_index).findChild(QtGui.QLineEdit, "lineEdit")
        findWidget.editingFinished.connect(self.LineEditChanged)
        self.tab_index += 1

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

実行したら、「Click Me!」を押します。メイン タブ ページの ボタンをクリックすると、新しいタブが作成され、「フィラー」ページのコンテンツが追加されます。

変数tab_indexはタブの数を追跡し、各タブの内容を参照できるようにします。

タブでウィジェットを見つけるには、Qt の findChild 関数を使用します。

findWidget = self.tabWidget.widget(self.tab_index).findChild(QtGui.QPushButton, "tabButton")

特定のウィジェットを見つけるのは簡単です。探しているウィジェットのタイプ ( QtGui.QPushButton) と、QtDesigner で割り当てた名前( tabButton)を指定します。

この場合、見つかったウィジェットは変数によって参照できますfindWidget

その後、通常どおり信号を関数スロットに接続できます。

findWidget.clicked.connect(self.TabButtonPressed)

この場合、新しいスタイルのシグナル接続メソッドを使用して、clicked() シグナルをTabButtonPressedプログラムで名前が付けられた関数に接続しました。

何かをしたいタブページのウィジェットごとにすすぎ、繰り返します。

その後は、本当に順風満帆です ;)

この情報が他のユーザーの GUI の取り組みに役立つことを願っています。おそらく、QToolBox ウィジェットでも同じ手法を使用できます。

于 2013-07-04T10:15:45.147 に答える