22

私は最近プログラミング、特に Python (PyQt) を始めたばかりです。メインQMainWindowクラスがあります。しかし、すべてのウィンドウのもの (メニュー、ツールバー、共通ボタン) が にあるように、UI ウィジェットから分離したかったのです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 コード/クラスを別のファイルに分割する必要がありますか?

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

[解決済み]

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

self.main_layout.addWidget(self.form_widget)

メニューの問題はもうありません

4

3 に答える 3

27

このようなものをお探しですか?私はあなた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_())
于 2012-01-11T06:33:21.363 に答える
11

Qt Designer を使用して、できるだけ多くの UI を作成することをお勧めします。

そうすれば、レイアウトなどを試すのがはるかに簡単になり、ほとんどの UI 関連のものを残りのアプリケーション ロジックから自動的に分離できます。これは、メイン ウィンドウと任意のダイアログ ボックスに対して行いますが、単純です。

次に、使用pyuic4してすべてのファイルから python モジュールをコンパイルし、uiそれらをすべて独自のサブパッケージにまとめます。

-wファイルをコンパイルするときにフラグを使用することをお勧めしuiます。これにより、直接サブクラス化できる単純なラッパー 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インスタンスの属性として直接アクセスできるようになりました。

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

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

于 2012-01-11T20:23:07.447 に答える
10
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()) 

正しい方法!!!

于 2013-06-18T08:42:39.793 に答える