2012-01-11 21 views
15

私は最近、プログラミングとPython(PyQt)を始めました。私は私のメインのQMainWindowクラスを持っています。しかし、私はすべてのウィンドウのもの(メニュー、ツールバー、共通ボタン)はQMainWindowにありますが、すべてのプログラム/ UI固有のウィジェット(pusgbuttons、コンボボックス、画像、チェックボックスなど)は個別のQWidgetにありますクラス。しかし、私はこの権利をしているかどうかはわかりません。PyQt - QMainWindowに別のUIウィジェットを追加する方法

  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コード/クラスを別のファイルに分割する必要がありますか?

ありがとうございます。

self.main_layout.addWidget(self.form_widget) 
:私は、UIウィジェットクラスからmain_widgetを削除した(現在はすべてのUIウィジェットはUIクラスウィジェット自体の上に直接配置されている)だけでこれを行う -

は、私は私のミスを見つけた

を[SOLVED]

メニューでこれ以上問題はありません

+0

私は間違いを発見しました。私はUIウィジェットからmain_widgetを削除し、他のすべての小さなウィジェット(ボタン、編集ラインなど)の保持ウィジェットとしてそれ自身を使用し、メインクラスは単純にUIウィジェット(上記参照)をインスタンス化します。 – linuxoid

答えて

20

このようなものをお探しですか?私はできるだけUIの多くを作成するためにはQt Designerを使用することをお勧めしますあなたの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_()) 
7

何であるか本当にわかりません。

このようにレイアウトなどを実験するほうがずっと簡単で、ほとんどのUI関連のものがアプリケーションロジックの残りの部分から自動的に分離されます。これは、メインウィンドウとすべてのダイアログボックスで行いますが、シンプルです。

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

uiファイルをコンパイルするときに、-wフラグを使用することをおすすめします。これにより、直接サブクラス化できる単純なラッパーUIクラスが生成されます。

だからあなたのメインウィンドウはこのような何かを探して終わるでしょう:Qtのデザイナーに追加されたすべてのウィジェットがMainWindowインスタンスの属性として直接アクセスできるようになりましであることを

from ui.mainwindow import MainWindowUI 

class MainWindow(MainWindowUI): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     # connect signals... 
     # do other setup stuff... 

注意を。

開発中になるまで、より小さなモジュールにアプリケーションを分割する心配はありません。それは必要でないと判明するかもしれませんが、アプリケーションが複雑になると、これをどうやって行うのかがより明白になります。

すべてのプロジェクトが異なっています。厳密で高速なルールはありません。

+1

私はQt Designerを使用していましたが、生成されたコードが気に入らず、ひどく見えて、後で変更するのは難しいです。本当に必要のないゴミもたくさん追加されます。だからこそ私はUIを自分で一から書き始めました。このようにして、すべてのコード行を制御します。私は何かを見逃しているかもしれませんが、私は学びます。ご返信ありがとうございます。 – linuxoid

+5

@ user665327あなたは、生成されたモジュールの目的を完全に誤解しています。彼らは編集のためのものではありません。彼らは_importing_のためだけに意味されています。私は手でUIコードを書くのに間違っているとは言いませんが、Qt Designerを使わないことで大いに逃しています。少なくとも、実験用のツールとして使用するべきです。そして、あなたが 'pyuic'によって生成されたコードを使用しなくても、それがどのように動作するかを見て、あなたはまだ_a lot_を知ることができます(これはレイアウト管理に関して特に当てはまります)。 – ekhumoro

8
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()) 

正しい方法!

関連する問題