PyQt5: прикрепить положение кнопки к координатам окна

Итак, я пытаюсь немного поэкспериментировать с 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, чтобы при масштабировании окна кнопка перемещалась внутри.

Можно ли установить минимальный размер My Window по отношению к минимальному размеру QPushButtons (когда кнопки не подходят к размеру My Window, его нельзя уменьшить)?

Вот простой экран того, чего я пытаюсь добиться (исходные кнопки разрезаны пополам, они исчезнут, если My Window станет меньше):

введите здесь описание изображения

Спасибо.


person Josh E.    schedule 30.03.2020    source источник


Ответы (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()
person alec    schedule 30.03.2020
comment
Спасибо, работает отлично! Что касается class Button_events(QMainWindow) , вы рекомендуете просто помещать события кнопки в метод iniUI(self) вместо создания другого класса? Еще одна вещь, если я могу спросить вас. Я также пытаюсь заполнить пространство над кнопками двумя или тремя графиками, которые я рисую из таблицы MS Excel, используя matplotlib.pyplot в другом файле .py. Можно ли (и хорошее решение) наследовать эти графики из другого файла и строить их в реальном времени (один график из старых данных, а другой будет из данных, полученных через последовательный порт в реальном времени)? - person Josh E.; 30.03.2020
comment
Да, не имеет смысла создавать еще один класс, наследуемый от QMainWindow, для событий кнопок. Импортировать графические файлы должно быть нормально. - person alec; 31.03.2020