lin*_*oid 19 python layout pyqt qmainwindow
我最近才开始编程和Python(PyQt).我有我的主要QMainWindow课程.但我想将它与UI小部件分开,以便所有窗口内容(菜单,工具栏,常用按钮)都在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)
Run Code Online (Sandbox Code Playgroud)
你有什么建议将代码分成小块?怎么做得更好?或者对于UI来说,它们都可以在一个大的地方?我应该将UI代码/类分解为单独的文件吗?
谢谢.
[解决了]
我发现了我的错误 - 我从UI小部件类中删除了main_widget(现在所有UI小部件都直接放在UI类小部件本身上)并且只执行此操作:
self.main_layout.addWidget(self.form_widget)
Run Code Online (Sandbox Code Playgroud)
没有菜单的问题
Jef*_*eff 25
你在找这样的东西吗?我不确定你的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_())
Run Code Online (Sandbox Code Playgroud)
ekh*_*oro 10
我建议使用Qt Designer尽可能多地创建UI.
您会发现以这种方式试验布局等更容易,并且它会自动将大多数与UI相关的内容与其他应用程序逻辑分开.对主窗口以及任何对话框执行此操作,无论多么简单.
然后pyuic4用来编译所有ui文件中的python模块,并将它们放在各自的子包中.
我建议-w在编译ui文件时使用该标志.这将生成一个简单的包装器UI类,可以直接进行子类化.
所以你的主窗口最终看起来像这样:
from ui.mainwindow import MainWindowUI
class MainWindow(MainWindowUI):
def __init__(self):
super(MainWindow, self).__init__()
# connect signals...
# do other setup stuff...
Run Code Online (Sandbox Code Playgroud)
请注意,Qt Designer中添加的所有窗口小部件现在都可以直接作为MainWindow实例的属性访问.
我不担心在以后的开发过程中将应用程序分解为更小的模块.它可能不是必要的 - 但如果确实如此,一旦应用程序开始变得更加复杂,如何做到这一点将变得更加明显.
没有严格的规则 - 每个项目都不同.
小智 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())
Run Code Online (Sandbox Code Playgroud)
正确的方法!
| 归档时间: |
|
| 查看次数: |
53656 次 |
| 最近记录: |