プログラミングを始めたばかりで、特にPython(PyQt)。メインのQMainWindow
クラスがあります。しかし、すべてのウィンドウがもの(メニュー、ツールバー、共通ボタン)はQMainWindow
にありますが、すべてのプログラム/ UI固有のウィジェット(pusgbuttons、コンボボックス、画像、チェックボックスなど)は別のQWidget
クラスにあります。私はこれを正しくやっているかどうかわからない。
以下にその方法を示します。
class MyMainWindow(QMainWindow):
def __init__(self, parent = None):
super(MyMainWindow, self).__init__(parent)
self.main_widget = QWidget(self)
...
self.form_widget = FormWidget(self)
#This is my UI widget
self.main_layout = QVBoxLayout(self.main_widget)
self.main_layout.sizeConstraint = QLayout.SetDefaultConstraint
self.main_layout.addWidget(self.form_widget.main_widget)
#form_widget has its own main_widget where I put all other widgets onto
self.main_widget.setLayout(self.main_layout)
self.setCentralWidget(self.main_widget)
コードを小さな断片に分割することについてのあなたの提案は何ですか?どうすればいいですか?または、UIの場合、すべてを1つの大きな場所に配置できますか? UIコード/クラスを個別のファイルに分割する必要がありますか?
ありがとうございました。
[解決済み]
私は間違いを見つけました-main_widgetをUIウィジェットクラスから削除し(現在、すべてのUIウィジェットはUIクラスウィジェット自体に直接配置されます)、これを行うだけです:
self.main_layout.addWidget(self.form_widget)
メニューに関するこれ以上の問題
このようなものをお探しですか?あなたのmain_widget
は
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
class MyMainWindow(QMainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.form_widget = FormWidget(self)
self.setCentralWidget(self.form_widget)
class FormWidget(QWidget):
def __init__(self, parent):
super(FormWidget, self).__init__(parent)
self.layout = QVBoxLayout(self)
self.button1 = QPushButton("Button 1")
self.layout.addWidget(self.button1)
self.button2 = QPushButton("Button 2")
self.layout.addWidget(self.button2)
self.setLayout(self.layout)
app = QApplication([])
foo = MyMainWindow()
foo.show()
sys.exit(app.exec_())
import sys
from PyQt4 import QtCore, QtGui
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.form_widget = FormWidget(self)
_widget = QtGui.QWidget()
_layout = QtGui.QVBoxLayout(_widget)
_layout.addWidget(self.form_widget)
self.setCentralWidget(_widget)
class FormWidget(QtGui.QWidget):
def __init__(self, parent):
super(FormWidget, self).__init__(parent)
self.__controls()
self.__layout()
def __controls(self):
self.label = QtGui.QLabel("Name for backdrop")
self.txted = QtGui.QLineEdit()
self.lbled = QtGui.QLabel("Select a readNode")
self.cmbox = QtGui.QComboBox()
def __layout(self):
self.vbox = QtGui.QVBoxLayout()
self.hbox = QtGui.QHBoxLayout()
self.h2Box = QtGui.QHBoxLayout()
self.hbox.addWidget(self.label)
self.hbox.addWidget(self.txted)
self.h2Box.addWidget(self.lbled)
self.h2Box.addWidget(self.cmbox)
self.vbox.addLayout(self.hbox)
self.vbox.addLayout(self.h2Box)
self.setLayout(self.vbox)
def main():
app = QtGui.QApplication(sys.argv)
win = MainWindow()
win.show()
app.exec_()
if __name__ == '__main__':
sys.exit(main())
正しい方法!!!
Qt Designerを使用して、できるだけ多くのUIを作成することをお勧めします。
そのようにレイアウトなどを試してみるとはるかに簡単になり、UIに関連するほとんどの要素がアプリケーションロジックの残りの部分から自動的に分離されます。これはメインウィンドウに対しても、ダイアログボックスに対しても実行しますが、単純ではありません。
次に、pyuic4
を使用して、すべてのui
ファイルからpythonモジュールをコンパイルし、それらをすべて独自のサブパッケージにまとめます。
ui
ファイルをコンパイルするときは、-w
フラグを使用することをお勧めします。これにより、直接サブクラス化できる単純なラッパーUIクラスが生成されます。
したがって、メインウィンドウは次のようになります。
from ui.mainwindow import MainWindowUI
class MainWindow(MainWindowUI):
def __init__(self):
super(MainWindow, self).__init__()
# connect signals...
# do other setup stuff...
Qt Designerで追加されたすべてのウィジェットは、MainWindow
インスタンスの属性として直接アクセスできることに注意してください。
開発が後になるまで、アプリケーションを小さなモジュールに分割する心配はありません。必要ではないかもしれませんが、必要な場合は、アプリケーションがより複雑になり始めると、これを行う方法がより明確になります。
厳格なルールはありません-すべてのプロジェクトは異なります。