2016-05-18 10 views
0

私はQDialogを開き、子供に属するQComboBoxから簡単なアプリケーションを構築しています。アイテムを選択して情報を見ることができます。私がする必要があるのは、選択されたアイテムが示す情報の一部をcomboBox(またはこの子の別のデータ)から取得することです。PyQtを使用して子供からデータを取得

これは私が子供のウィジェットを開くために使用していたコードです:

class Window(QMainWindow): 
    def __init__(self): 
    #A lot of stuff in here 

    #I connect a QPushButton to this method to open the child 
    def Serial_connection(self, event): 
    configurePort.ConfigurePort(self).show() 

そして、これが子供のコードです:

class ConfigurePort(QDialog): 
    def __init__(self, parent = None): 
    QDialog.__init__(self, parent) 
    uic.loadUi("configurePort.ui", self) 

    self.initUi() 

    def initUi(self): 
    self.comboBox.activated[str].connect(self.Selected) 
    self.label.hide() 

    def Selected(self, text): 
    if text == "option 1": 
     self.label.setText("Option 1 selected") 

Selected方法から、私が必要テキストを取得するには:「選択1」を選択し、この情報を使用して別のことを行うために親に送信します(QMainWindow)。

どうすればいいですか?子供からデータを取得するにはどうすればよいですか?あなたが私を助けてくれることを願います。

+0

これはユーザーの入力を取得するための一時的なダイアログですか、開いていますか?彼らはすぐに選択に反応したいですか?または、「保存」ボタンをクリックしてダイアログを閉じるまで待つことを望みますか? –

+0

ご意見ありがとうございます。これは一時的な 'QDialog'です。 'QComboBox'から項目を選択すると、いくつかの情報が表示されます。私はその情報から変数を取り出し、それを親に( 'QDialog'から)送る必要があるので、後で別のことをするためにその情報を使うことができます。 –

答えて

1

一般的に、一時的なダイアログを使用してユーザーから情報を取得する場合、ダイアログはモーダルである必要があります。そのため、ユーザーはダイアログを終了するまで他のすべてのアクションをブロックできます。また、ダイアログを関数のように呼び出すことができ、結果を返すことができます。

次は、テキストの結果を返すモーダルダイアログの例です。

class ConfigurePort(QDialog): 
    def __init__(self, parent = None): 
     QDialog.__init__(self, parent) 
     uic.loadUi("configurePort.ui", self) 

     self.initUi() 

    def initUi(self): 
     self.comboBox.activated[str].connect(self.Selected) 
     self.label.hide() 

    def Selected(self, text): 
     if text == "option 1": 
      self.label.setText("Option 1 selected") 

    def getLabelText(self): 
     return self.label.text() 

    @classmethod 
    def launch(cls, parent=None): 
     dlg = cls(parent) 
     dlg.exec_() 
     text = dlg.getLabelText() 
     return text 


class Window(QMainWindow): 
    ... 
    def Serial_connection(self, event): 
     text = configurePort.ConfigurePort.launch(self) 
     print text 
+0

あなたの答えをありがとう、それは私を助けます。私は1つの質問があります:この行は何をしますか? 'dlg = cls(parent)'? 。私は 'デコレータ 'をよく理解していません。あなたの答えをもう一度ありがとう。 –

+1

通常、メソッドの最初の引数はクラスインスタンス( 'self')です。 'classmethod'でメソッドをデコレートすると、そのクラスのインスタンスではなくクラスだけを使ってメソッドを呼び出すことができ、最初の引数はクラス(インスタンスではありません)になります。基本的に、この関数を呼び出すと、ダイアログクラス( 'cls(...)')のインスタンスが作成され、モーダルに実行されます( 'cls.exec _()')。 'cls.exec _()'はダイアログが閉じるまでブロックします。次に、ダイアログウィンドウの結果をメインウィンドウの呼び出し元関数に返します。 –

関連する問題