web-dev-qa-db-ja.com

Python:PyQtポップアップウィンドウ

だから私はPythonアプリケーションのQtでGUIを作成しています。ボタンが押された後、適切な遅延オブジェクトが実行され、いくつかのタスクを実行する状況になりました。 1つまたは2つのものを含む別のウィンドウを開く必要がありますが、この新しい別のウィンドウの作成方法がわからないようですが、作成方法の例を教えてください。

22
Morphine

気が狂う可能性のある一般的なエラーは、作成したポップアップウィンドウのハンドルを、python変数(メインウィンドウのデータメンバーなど)に残る変数に格納するのを忘れることです。

以下は、ボタンを押してポップアップを開くボタンを持つメインウィンドウを作成する簡単なプログラムです。

_#!/usr/bin/env python
#-*- coding: utf-8 -*-

import sys
from PyQt4.Qt import *

class MyPopup(QWidget):
    def __init__(self):
        QWidget.__init__(self)

    def paintEvent(self, e):
        dc = QPainter(self)
        dc.drawLine(0, 0, 100, 100)
        dc.drawLine(100, 0, 0, 100)

class MainWindow(QMainWindow):
    def __init__(self, *args):
        QMainWindow.__init__(self, *args)
        self.cw = QWidget(self)
        self.setCentralWidget(self.cw)
        self.btn1 = QPushButton("Click me", self.cw)
        self.btn1.setGeometry(QRect(0, 0, 100, 30))
        self.connect(self.btn1, SIGNAL("clicked()"), self.doit)
        self.w = None

    def doit(self):
        print "Opening a new popup window..."
        self.w = MyPopup()
        self.w.setGeometry(QRect(100, 100, 400, 200))
        self.w.show()

class App(QApplication):
    def __init__(self, *args):
        QApplication.__init__(self, *args)
        self.main = MainWindow()
        self.connect(self, SIGNAL("lastWindowClosed()"), self.byebye )
        self.main.show()

    def byebye( self ):
        self.exit(0)

def main(args):
    global app
    app = App(args)
    app.exec_()

if __name__ == "__main__":
    main(sys.argv)
_

Pythonユーザーにとって驚くかもしれないと思うのは、あなたが直面している問題は、新しいウィジェットへの参照をメインに保存しない場合、たとえば[ w = MyPopup(...)の代わりにself.w = MyPopup(...)ウィンドウが表示されないようです(実際に作成され、すぐに破棄されます)。

その理由は、ローカル変数wがウィジェットを明示的に参照していないために範囲外になると、ウィジェットが削除されるためです。これは、ボタンをもう一度押すと、2番目のポップアップが表示されたときに最初のポップアップが閉じていることがわかります。

これは、いくつかのポップアップを作成する必要がある場合、たとえばpythonリストに入れて、ユーザーがポップアップを閉じたらこのリストから削除する必要があることを意味します。この例では、コンストラクタで_self.w = []_に変更してからself.w.append(MyPopup(...))を実行することができます。これにより、いくつかのポップアップを開くことができます。

45
6502

一般的に、次のように、someQWidget.show()で複数の親のないウィンドウを表示するだけです。

w1 = QLabel("Window 1")
w2 = QLabel("Window 2")
w1.show()
w2.show()

しかし、ほとんどの場合、 this のようなモーダル標準ダイアログが必要です。また、必ず modal dialogs を理解してください。

3
flying sheep