2017-07-27 196 views
0

我是新來的GUI開發,我想學習如何在python中使用pyqt5。 下面是我正在處理的示例代碼。我想要一個帶有一些複選框,窗口右側的組合框和單選按鈕的窗口。代碼中包含QtWidget對象的詳細信息。小工具位置和窗口大小

from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy, QWidget, QPushButton, QComboBox, QRadioButton, QVBoxLayout, QCheckBox 
from PyQt5.QtGui import QIcon 

class App(QMainWindow): 

    def __init__(self): 
     super().__init__() 
     self.left = 0 
     self.top = 500 
     self.title = 'Chip2 Torque Data' 
     self.width = 500 
     self.height =500 
     self.initUI() 

    def initUI(self): 
     self.setWindowTitle(self.title) 
     self.setGeometry(self.left, self.top, self.width, self.height) 

     xselect=QRadioButton("X",self) 
     xselect.setChecked(True) 

     xselect.move(340,400) 
     zselect=QRadioButton("Z",self) 
     zselect.move(380,400) 
     sselect=QRadioButton("SP1",self) 
     sselect.move(420,400) 
     pass_list=QComboBox(self) 
     pass_list.addItems(sheets_idealcut) 
     pass_list.move(340,300) 
     rawdata_check=QCheckBox("Raw Data",self) 
     rawdata_check.setChecked(True) 
     rawdata_check.move(340,200) 
     mvgavg_check=QCheckBox("Moving average",self) 
     mvgavg_check.setChecked(True) 
     mvgavg_check.move(380,200) 
     mvgstd_check=QCheckBox("Moving stdev",self) 
     mvgstd_check.setChecked(True) 
     mvgstd_check.move(420,200) 
     self.show() 
if __name__ == '__main__': 
  sheets_idealcut=['pass2','pass3','pass4','pass5'] 

    app = QApplication.instance() 
    if app is None: 
     app = QApplication(sys.argv) 
    else: 
     print('QApplication instance already exists: %s' % str(app)) 
    ex = App() 
    #ex.show() 
    app.exec_() 

下面是代碼的輸出。 (請忽略重疊的複選框的名字。我打算以後改正。)

enter image description here

我的問題是,當我最大化這個窗口中,QtWidget對象(QComboBoxQRadioButtonQCheckBox)不調整自己的位置與新的窗口大小。
enter image description here

因此,爲了小部件自動重新定位自己,應該使用什麼方法?

我使用了Google搜索,但找不到任何有用的東西。

請幫忙。

+0

您需要的小工具添加到[佈局](https://doc.qt.io/qt-5/layout.html ) – user3419537

+0

我已經知道佈局,但我無法弄清楚如何調整QMainwindow中佈局的位置,使佈局位於窗口的右側。 – Kanmani

回答

1

您應該使用佈局進行動態大小調整。有很多不同的佈局。本例中使用的佈局是最基本的類型。我還將「App」的父項更改爲QDialog。他們更容易處理。

這裏是你的應用的一個例子,利用佈局:

import sys 
from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy, QWidget, QPushButton, QComboBox, QRadioButton, \ 
QVBoxLayout, QCheckBox, QHBoxLayout, QGroupBox, QDialog 
from PyQt5.QtGui import QIcon 

class App(QDialog): 

    def __init__(self): 
     super().__init__() 
     self.left = 0 
     self.top = 500 
     self.title = 'Chip2 Torque Data' 
     self.width = 500 
     self.height = 500 
     self.initUI() 

    def initUI(self): 
     self.setWindowTitle(self.title) 
     self.setGeometry(self.left, self.top, self.width, self.height) 

     self.main_layout = QVBoxLayout() 

     xselect=QRadioButton("X",self) 
     xselect.setChecked(True) 
     # xselect.move(340,400) 
     self.main_layout.addWidget(xselect) 

     zselect=QRadioButton("Z",self) 
     # zselect.move(380,400) 
     self.main_layout.addWidget(zselect) 

     sselect=QRadioButton("SP1",self) 
     # sselect.move(420,400) 
     self.main_layout.addWidget(sselect) 



     pass_list=QComboBox(self) 
     pass_list.addItems(sheets_idealcut) 
     self.main_layout.addWidget(pass_list) 
     #pass_list.move(340,300) 
     rawdata_check=QCheckBox("Raw Data",self) 
     rawdata_check.setChecked(True) 
     self.main_layout.addWidget(rawdata_check) 
     #rawdata_check.move(340,200) 
     mvgavg_check=QCheckBox("Moving average",self) 
     mvgavg_check.setChecked(True) 
     #mvgavg_check.move(380,200) 
     mvgstd_check=QCheckBox("Moving stdev",self) 
     mvgstd_check.setChecked(True) 
     #mvgstd_check.move(420,200) 

     self.check_group = QHBoxLayout() 
     self.check_group.addWidget(mvgavg_check) 
     self.check_group.addWidget(mvgstd_check) 
     self.check_group.stretch(1) 

     self.main_layout.addLayout(self.check_group) 
     self.setLayout(self.main_layout) 
     self.show() 

if __name__ == '__main__': 
    sheets_idealcut=['pass2','pass3','pass4','pass5'] 

    app = QApplication.instance() 
    if app is None: 
     app = QApplication(sys.argv) 
    else: 
     print('QApplication instance already exists: %s' % str(app)) 
    ex = App() 
    #ex.show() 
    app.exec_() 
1

您正在使用move(x,y)將Widgets設置爲特定的固定位置。所以你可以寫一個函數來調用最大化窗口,然後相應地重新定位你的小部件。

另一種自動化方法是使用盒子佈局。​​和QtGui.QVBoxLayout是水平或垂直排列小部件的基本佈局類。從你的照片中,我不知道你希望你的小部件到底有什麼確切的位置,所以我試圖解釋它,就像我認爲你想要的那樣。

元素的每一行可以被分配到一個HBox中是這樣的:

hbox = QtGui.QHBoxLayout() 
hbox.addStretch(1) 
hbox.addWidget(rawdata_check) 
hbox.addWidget(mvgavg_check) 
hbox.addWidget(mvgstd_check) 

如果然後調整窗口小部件應全自動被重新定位到窗口的右側。 QtDesigner可以幫助您安排所有元素。