web-dev-qa-db-ja.com

PyQt-QMainWindowに個別のUIウィジェットを追加する方法

プログラミングを始めたばかりで、特にPython(PyQt)。メインのQMainWindowクラスがあります。しかし、すべてのウィンドウがもの(メニュー、ツールバー、共通ボタン)はQMainWindowにありますが、すべてのプログラム/ UI固有のウィジェット(pusgbuttons、コンボボックス、画像、チェックボックスなど)は別のQWidgetクラスにあります。私はこれを正しくやっているかどうかわからない。

  1. 私はレイアウトに問題があります-マウスでクリックできないように、目に見えないものがメニューを覆っているため、メインウィンドウにUIウィジェットを正しく追加していないと思います

以下にその方法を示します。

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)
  1. 私は他のPythonアプリケーションが多くの小さなコードのファイルに分割されるプログラムを見てきました(私が理解しているように、メインクラスにすべてを入れることは読めないか管理できません)。

コードを小さな断片に分割することについてのあなたの提案は何ですか?どうすればいいですか?または、UIの場合、すべてを1つの大きな場所に配置できますか? UIコード/クラスを個別のファイルに分割する必要がありますか?

ありがとうございました。

[解決済み]

私は間違いを見つけました-main_widgetをUIウィジェットクラスから削除し(現在、すべてのUIウィジェットはUIクラスウィジェット自体に直接配置されます)、これを行うだけです:

self.main_layout.addWidget(self.form_widget)

メニューに関するこれ以上の問題

19
linuxoid

このようなものをお探しですか?あなたの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_())
24
Jeff
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()) 

正しい方法!!!

10
user1176501

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インスタンスの属性として直接アクセスできることに注意してください。

開発が後になるまで、アプリケーションを小さなモジュールに分割する心配はありません。必要ではないかもしれませんが、必要な場合は、アプリケーションがより複雑になり始めると、これを行う方法がより明確になります。

厳格なルールはありません-すべてのプロジェクトは異なります。

10
ekhumoro