この記事の内容: PyQt5、Qt デザイナー、PyCharm
目次
ステップ 1: Qt デザイナーで 2 つのフォームを作成する
ステップ 2: サブフォームをメイン フォームのボタン コントロールに関連付ける
まずは完成したエフェクトを見てみましょう。
動画ではメインウィンドウとサブウィンドウを1つずつデザインしていますが、サブウィンドウがいくつ必要になっても作成方法は同じです。具体的な実装方法をご紹介します。
ステップ 1: Qt デザイナーで 2 つのフォームを作成する
Qt デザイナーを開き、一度に 2 つのメイン ウィンドウ フォームを直接作成し、次の図に示すように、メイン フォームの中央にボタン コントロールを配置します。
次に、2 つのフォームの .ui ファイルを同じフォルダーに保存します。注: 保存するときは、個別に保存するフォームにマウス フォーカスを置き、各フォームを個別に保存する必要があります。また、.ui ファイルを .py ファイルに変換する場合は、各 .ui ファイルを個別に選択する必要もあります。完了後に次の図に示すように、個別に変換されます。
ステップ 2: サブフォームをメイン フォームのボタン コントロールに関連付ける
まず、untitled2.py ファイルを見てください。自動変換されたコードでは、デフォルトでオブジェクト クラスが継承されています。コードは次のとおりです。
class Ui_MainWindow(object):
ウィンドウ操作を実行するには、継承したオブジェクト クラスを QMainWindow クラスに変更する必要があります。QMainWindow クラスは PyQt5.QtWidgets モジュール内にあるため、インポートする必要があります。変更後のコードは次のとおりです。
from PyQt5.QtWidgets import QMainWindow
class Ui_MainWindow(QMainWindow):
サブフォームの .py ファイルの継承クラスを変更した後、untitled.py メイン フォーム ファイルを開きます。このファイルでは、まず QMainWindow オブジェクトの show() メソッドを使用してサブフォームを開くスロット関数を定義します。以下のように:
def open(self): # 创建1个自定义函数open打开子窗体
import untitled2 # 导入子窗体
self.second = untitled2.Ui_MainWindow() # 引用子窗体,并命名为second
self.second.resize(736, 467) # 初始化子窗体大小
self.second.setWindowTitle("这是子窗体") # 初始化子窗体的标题
self.second.show() # 显示子窗体
次に、PushButton ボタンの clicked() 信号をカスタム スロット関数 open() に関連付けます。コードは次のとおりです。
self.pushButton.clicked.connect(self.open)
untitled.py メイン フォームを実行し、ボタンをクリックしてサブフォームを開きます。
完全なコード
不明な場合は、以下のソースコードを参照してください。
メインフォームのソースコード (untitled.py):
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(750, 500)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(190, 140, 291, 81))
self.pushButton.setObjectName("pushButton")
# 将按钮和显示第2个窗口的自定义函数关联
self.pushButton.clicked.connect(self.open)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "打开新窗口"))
def open(self): # 创建1个自定义函数open打开子窗体
import untitled2 # 导入子窗体
self.second = untitled2.Ui_MainWindow() # 引用子窗体,并命名为second
self.second.resize(736, 467) # 初始化子窗体大小
self.second.setWindowTitle("这是子窗体") # 初始化子窗体的标题
self.second.show() # 显示子窗体
import sys
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
サブフォームのソースコード (untitled2.py):
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow
class Ui_MainWindow(QMainWindow):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(736, 467)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
def __init__(self):
super(Ui_MainWindow, self).__init__()
self.setupUi(self)
寒いし手も冷たいしコードも難しいですが、公式を読んでくれた方はクリックして注目していただければ幸いです~~~ありがとうございます~~~