Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
25
Help us understand the problem. What is going on with this article?
@donkonishi

PyQt5とPythonでサブウィンドウを出してみる

More than 3 years have passed since last update.

前回の記事に引き続きPyQt5で遊びます。

今回はサブウィンドウを出してみる

まずは普通にサブウィンドウを出力

test.py
#!/usr/bin/env python3

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        # ボタンの作成
        makeWindowButton = QPushButton("&make window")
        # クリックイベント(makeWindow())の追加
        makeWindowButton.clicked.connect(self.makeWindow)
        # レイアウトの作成
        layout = QHBoxLayout()
        # レイアウトにボタンの追加
        layout.addWidget(makeWindowButton)
        # ウィンドウにレイアウトを追加
        self.setLayout(layout)

    def makeWindow(self):
        # サブウィンドウの作成
        subWindow = SubWindow()
        # サブウィンドウの表示
        subWindow.show()

class SubWindow(QWidget):
    def __init__(self, parent=None):
        # こいつがサブウィンドウの実体?的な。ダイアログ
        self.w = QDialog(parent)
        label = QLabel()
        label.setText('Sub Window')
        layout = QHBoxLayout()
        layout.addWidget(label)
        self.w.setLayout(layout)

    def show(self):
        self.w.exec_()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    main_window = MainWindow()

    main_window.show()
    sys.exit(app.exec_())

親のウィンドウでサブウィンドウのクラスをインスタンス化して、show()してあげるとサブウィンドウができちゃいます。

self.w = QDialog(parent)
ここらへん、大事。

これをせずに、サブウィンドウクラスで
self.setLayout(layout)
とやってもエラーが起きちゃうので、だめ。

呼び出し元クラスと値の受け渡しを行うサブウィンドウの出力

サブウィンドウを出力して、パラメータを入力する、みたいな状況、多分ありますよね。
やってみます。

test.py
#!/usr/bin/env python3

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        makeWindowButton = QPushButton("&make window")
        makeWindowButton.clicked.connect(self.makeWindow)

        self.label = QLabel()
        self.label.setText("default:")

        layout = QHBoxLayout()
        layout.addWidget(makeWindowButton)
        layout.addWidget(self.label)
        self.setLayout(layout)

    def makeWindow(self):
        subWindow = SubWindow(self)
        subWindow.show()

    # サブウィンドウから実行
    def setParam(self, param):
        self.label.setText(param)

class SubWindow:
    def __init__(self, parent=None):
        self.w = QDialog(parent)
        self.parent = parent

        label = QLabel()
        label.setText('Sub Window')

        self.edit = QLineEdit()

        button = QPushButton('送信')
        button.clicked.connect(self.setParamOriginal)

        layout = QVBoxLayout()
        layout.addWidget(label)
        layout.addWidget(self.edit)
        layout.addWidget(button)

        self.w.setLayout(layout)

    # ここで親ウィンドウに値を渡している
    def setParamOriginal(self):
        self.parent.setParam(self.edit.text())

    def show(self):
        self.w.exec_()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    main_window = MainWindow()

    main_window.show()
    sys.exit(app.exec_())

サブウィンドウから親ウィンドウのラベルに値を入れ込んであげてる。
Python初めて4日なのとPythonの言語についての勉強はほとんどしてなくて、selfの扱い方がわからずに少し詰まった。コード汚くてごめんなさい。

感想・考察

PyQtほんとすごい、すごい、、、、とても便利だなと思いました。
リファレンス読もうとするんだけど、英語力の無さとPythonにまだ慣れてなくて、ろくに読めない。
もう少しPythonになれなきゃなぁ。。。

最後に

コード汚くてほんと御免なさい、、、、、

25
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
donkonishi
(つ∀-)オヤスミー

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
25
Help us understand the problem. What is going on with this article?