【问题标题】:PyQt5: attach button position to the window coordinatesPyQt5:将按钮位置附加到窗口坐标
【发布时间】:2020-03-30 08:54:54
【问题描述】:

所以,我正在尝试使用 PyQt5 进行一些实验。我创建了一个带有两个QPushButtons 的基本窗口。

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy
import sys

class Okno(QMainWindow):
    def __init__(self):
        super(Okno, self).__init__()
        self.setGeometry(500, 500, 900, 500)  # window size setGeometry(xpos, ypos, w, h)
        # self.setFixedSize(900, 500) # fix window position
        self.setWindowTitle("My window")
        self.label = QtWidgets.QLabel(self)
        self.button1 = QtWidgets.QPushButton(self)
        self.button2 = QtWidgets.QPushButton(self)
        self.iniUI()

    # Buttons
    def iniUI(self):
        self.button1.setText("Open file")
        self.button1.move(75, 450)
        self.button1.setMinimumWidth(150)
        self.button1.clicked.connect(Button_events.open_file)  # add (connect) button event 

        self.button2.setText("Exit")
        self.button2.move(750, 450)
        self.button2.clicked.connect(exit)

# Button events
class Button_events(QMainWindow):
    def open_file(self):
        print("Open file")

# Main method
def window():
    app = QApplication(sys.argv)
    okno = Okno()
    okno.show()
    sys.exit(app.exec_())


window()

我已经通过绝对坐标设置按钮的位置。当我调整My Window 的大小时,按钮只是保持其绝对坐标。

如何将按钮的坐标附加到My Window,所以当我缩放窗口时,按钮会在其中移动。

是否可以相对于最小QPushButtons 尺寸设置最小My Window 尺寸(当按钮不适合My Window 时,不能将其调整得更小)?

这是我想要实现的简单屏幕(原来的按钮被切成两半,如果My Window 变小它们就会消失):

谢谢。

【问题讨论】:

    标签: python pyqt5 window qpushbutton qmainwindow


    【解决方案1】:

    我建议使用布局来处理所有小部件的位置和窗口的最小尺寸。使用 QGridLayout,您可以将按钮对齐到左下角和右下角。

    from PyQt5 import QtWidgets, QtCore
    from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy
    import sys
    
    class Okno(QMainWindow):
        def __init__(self):
            super(Okno, self).__init__()
            self.setGeometry(500, 500, 900, 500)
            self.setWindowTitle("My window")
            self.label = QtWidgets.QLabel()
            self.button1 = QtWidgets.QPushButton()
            self.button2 = QtWidgets.QPushButton()
            self.iniUI()
    
        # Buttons
        def iniUI(self):
            w = QtWidgets.QWidget()
            self.setCentralWidget(w)
            grid = QtWidgets.QGridLayout(w)
    
            self.button1.setText("Open file")
            self.button1.setMinimumWidth(150)
            self.button1.clicked.connect(self.open_file)
            self.button2.setText("Exit")
            self.button2.clicked.connect(self.close)
    
            grid.addWidget(self.button1, 0, 0, QtCore.Qt.AlignLeft | QtCore.Qt.AlignBottom)
            grid.addWidget(self.button2, 0, 1, QtCore.Qt.AlignRight | QtCore.Qt.AlignBottom)
    
        def open_file(self):
            print("Open file")
    
    
    def window():
        app = QApplication(sys.argv)
        okno = Okno()
        okno.show()
        sys.exit(app.exec_())
    
    window()
    

    【讨论】:

    • 谢谢你,它工作得很好!至于 class Button_events(QMainWindow) ,您是否建议将按钮事件放在 iniUI(self) 方法中而不是创建另一个类?如果我可以问你一件事。我还试图用我在另一个 .py 文件中使用matplotlib.pyplot 从 MS Excel 表中绘制的两个或三个图表来填充按钮上方的空间。是否有可能(并且是一个好的决定)从另一个文件继承这些图表并实时绘制它们(一个图表来自旧数据,另一个来自通过串行端口实时接收的数据)?跨度>
    • 是的,为按钮事件创建另一个继承自 QMainWindow 的类是没有意义的。导入图形文件应该没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多