如何添加使用 PyQt 移动窗口大小时移动的文本编辑、标签和按钮?

Posted

技术标签:

【中文标题】如何添加使用 PyQt 移动窗口大小时移动的文本编辑、标签和按钮?【英文标题】:How to add TextEdit, Labels and Buttons that move when Window Size is moved using PyQt? 【发布时间】:2016-06-07 21:41:03 【问题描述】:

我是 PyQt 的新手,但在过去的几天里,我试图创建一个 GUI,它具有标签、TextEdit 和在窗口大小移动(最小化或放大)时移动的按钮,我尝试这样做,但按钮卡在左上角,而标签和 TextEdit 完全没有出现在表单上,​​请帮忙。这是我的代码的 sn-p

import sys
from PyQt4 import QtGui, QtCore
class Window(QtGui.QMainWindow, QtGui.QWidget):

`   def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle("PTE")
        self.setWindowIcon(QtGui.QIcon('.png'))
        self.center()

        # Adding Menu to the GUI
        quitAction = QtGui.QAction(QtGui.QIcon('exit.png'), "&Quit", self)
        quitAction.setShortcut("Ctrl+Q")  
        quitAction.setStatusTip('Exit Application')
        quitAction.triggered.connect(self.close_application)

        undoAction = QtGui.QAction(QtGui.QIcon('undo.png'), "&Undo", self)
        undoAction.setShortcut("Ctrl+Z")        
        undoAction.triggered.connect(self.close_application)

        aboutAction = QtGui.QAction("&About PTE...", self)


        self.statusBar()

        #Actual Main Menu with options
        mainMenu = self.menuBar()
        fileMenu = mainMenu.addMenu('&File')        
        fileMenu.addAction(quitAction)

        fileMenu = mainMenu.addMenu('&Edit')
        fileMenu.addAction(undoAction)

        fileMenu = mainMenu.addMenu('&Help')
        fileMenu.addAction(aboutAction)

        self.home()


    #Centering Window on the screen
    def center(self):
        gui = self.frameGeometry()
        cp = QtGui.QDesktopWidget().availableGeometry().center()
        gui.moveCenter(cp)
        self.move(gui.topLeft())


     def home(self):
         #Buttons
        qbtn = QtGui.QPushButton('Quit', self)
        qbtn.clicked.connect(self.close_application)

        rbtn = QtGui.QPushButton("Run", self)
        rbtn.clicked.connect(self.close_application)

        hbox = QtGui.QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(qbtn)
        hbox.addWidget(rbtn)

        vbox = QtGui.QVBoxLayout()
        vbox.addStretch(1)
        vbox.addLayout(hbox)

        self.setLayout(vbox) 


        self.show()

        #Labels and TextBox 
        Intervals = QtGui.QLabel('Number of intervals (0<=20) :')
        Timesteps = QtGui.QLabel('Number of time steps (<=1000) : ')

        IntervalsEdit = QtGui.QLineEdit()
        TimestepsEdit = QtGui.QLineEdit()


        grid = QtGui.QGridLayout()
        grid.setSpacing(2)

        grid.addWidget(Intervals, 1, 0)
        grid.addWidget(IntervalsEdit, 1, 1)

        grid.addWidget(Timesteps, 2, 0)
        grid.addWidget(TimestepsEdit, 2, 1)


        self.setLayout(grid)

        self.show()

    #What to display when the app is closed    
     def close_application(self):
         #Popup message before closing the application in Binary
         choice = QtGui.QMessageBox.question(self, 'Message',"Are you sure you want to exit?", 
                                        QtGui.QMessageBox.Yes | QtGui.QMessageBox.No )

         if choice == QtGui.QMessageBox.Yes:
              print(" Until Next Time")
              sys.exit()
         else:
             pass

def run():        
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())

    run() 

【问题讨论】:

您使用了两次setLayout。您只能使用一次。您需要将QGridLayout 添加到QHBoxLayout(例如) 【参考方案1】:

嘿,我解决了您的代码的问题。在我的修复中,我将QGridLayout 添加到QHBoxLayout。如果您想将网格放在另一个位置,您可能需要将两个布局都嵌套在第三种布局中。

请注意,当您只能设置 1 种布局时,您将 setLayout 用于 grid 用于 vbox。您还不需要两次调用show()。您还将QVBoxLayout 添加到hbox,但不要添加任何小部件。事实上,这是没有用的。如果您希望 hboxgrid 垂直对齐,则需要改为 vbox.addLayout(grid)self.setLayout(vbox)

import sys

from PyQt4 import QtGui, QtCore
class Window(QtGui.QMainWindow, QtGui.QWidget):

`   def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle("PTE")
        self.setWindowIcon(QtGui.QIcon('.png'))
        self.center()

        # Adding Menu to the GUI
        quitAction = QtGui.QAction(QtGui.QIcon('exit.png'), "&Quit", self)
        quitAction.setShortcut("Ctrl+Q")  
        quitAction.setStatusTip('Exit Application')
        quitAction.triggered.connect(self.close_application)

        undoAction = QtGui.QAction(QtGui.QIcon('undo.png'), "&Undo", self)
        undoAction.setShortcut("Ctrl+Z")        
        undoAction.triggered.connect(self.close_application)

        aboutAction = QtGui.QAction("&About PTE...", self)


        self.statusBar()

        #Actual Main Menu with options
        mainMenu = self.menuBar()
        fileMenu = mainMenu.addMenu('&File')        
        fileMenu.addAction(quitAction)

        fileMenu = mainMenu.addMenu('&Edit')
        fileMenu.addAction(undoAction)

        fileMenu = mainMenu.addMenu('&Help')
        fileMenu.addAction(aboutAction)

        self.home()


    #Centering Window on the screen
    def center(self):
        gui = self.frameGeometry()
        cp = QtGui.QDesktopWidget().availableGeometry().center()
        gui.moveCenter(cp)
        self.move(gui.topLeft())


     def home(self):
         #Buttons
        qbtn = QtGui.QPushButton('Quit', self)
        qbtn.clicked.connect(self.close_application)

        rbtn = QtGui.QPushButton("Run", self)
        rbtn.clicked.connect(self.close_application)

        hbox = QtGui.QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(qbtn)
        hbox.addWidget(rbtn)

        vbox = QtGui.QVBoxLayout()
        vbox.addStretch(1)
        vbox.addLayout(hbox)



        #self.show() #this only needs to be called once

        #Labels and TextBox 
        Intervals = QtGui.QLabel('Number of intervals (0<=20) :')
        Timesteps = QtGui.QLabel('Number of time steps (<=1000) : ')

        IntervalsEdit = QtGui.QLineEdit()
        TimestepsEdit = QtGui.QLineEdit()


        grid = QtGui.QGridLayout()
        grid.setSpacing(2)

        grid.addWidget(Intervals, 1, 0)
        grid.addWidget(IntervalsEdit, 1, 1)

        grid.addWidget(Timesteps, 2, 0)
        grid.addWidget(TimestepsEdit, 2, 1)

        hbox.addLayout(grid) #this will add the grid to the horizontal layout.
        #if you want it to be vertcally aligned change this to vbox.addLayout(grid)...

        #... and this to self.setLayout(vbox)
        self.setLayout(hbox)

        self.show()

    #What to display when the app is closed    
     def close_application(self):
         #Popup message before closing the application in Binary
         choice = QtGui.QMessageBox.question(self, 'Message',"Are you sure you want to exit?", 
                                        QtGui.QMessageBox.Yes | QtGui.QMessageBox.No )

         if choice == QtGui.QMessageBox.Yes:
              print(" Until Next Time")
              sys.exit()
         else:
             pass

【讨论】:

这真的很有帮助,非常感谢,现在我可以添加更多的文本编辑和标签......。干杯 如果某个答案对您有用,您也应该接受该答案。这提高了 *** 作为问题和答案的来源,并激励用户帮助其他用户 - 欢迎使用 ***!。

以上是关于如何添加使用 PyQt 移动窗口大小时移动的文本编辑、标签和按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt5 中相对于父窗口移动子窗口?

如何在 PyQt5 中保持行和列大小与网格布局相同?

我们如何防止当我调整窗口大小时,我的图像使用 HTML-CSS 移动?

Pyqt5 从 QtWebChannel 移动窗口

怎样使用ABBYY finereader把PDF转成可编辑文件

使用垂直自动调整大小时视图向上移动