Как сделать масштабирование виджетов с помощью окна в PyQt5? - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь настроить графический интерфейс, который будет включать несколько страниц в PyQt5. Окно будет иметь минимальный размер 800x600, но его можно настраивать и дальше. Я хочу, чтобы большинство, но не все элементы в окне масштабировались вместе с ним. У меня уже есть решение, но я чувствую, что оно не очень элегантное.

Вот пример окна 800x600:

enter image description here

А вот еще один пример после масштабирования

enter image description here

Я пытался использовать QVBoxLayout, но с этой системой мне не удается сохранить макет, как он есть здесь (не говоря уже о том, что это невозможно), а все виджеты становятся центрированными и одинаковой ширины. Позже я мог бы также посмотреть на добавление виджетов к той стороне, которая будет иметь то же значение y, что и некоторые из существующих виджетов, что является другой вещью, которую я не уверен, как делать с макетом блока. .

Вот соответствующий код:

class CreatePage(QWidget):
    def __init__(self, parent=None):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.homeBtn = QPushButton("Home", self)
        self.homeBtn.move(10, 10)

        self.frontLabel = QLabel("Front", self)
        self.frontLabel.setFont(QFont("Decorative", 20))

        self.frontEdit = QTextEdit(self)
        self.frontEdit.setFont(QFont("Decorative", 11))

        self.backLabel = QLabel("Back", self)
        self.backLabel.setFont(QFont("Decorative", 20))

        self.backEdit = QTextEdit(self)
        self.backEdit.setFont(QFont("Decorative", 11))

    def paintEvent(self, e):
        qp = QPainter()
        qp.setFont(QFont("Decorative", 20))

        size = self.size()
        h = size.height()
        w = size.width()

        frontW = qp.fontMetrics().width("Front")
        self.frontLabel.move((w/2) - (frontW/2) , h/15)
        #I use fontMetrics to determine the width of the text
        #I then use this information to centre the text

        self.frontEdit.move(50, h/15 + 40)
        self.frontEdit.resize(w-100, h/3)

        backW = qp.fontMetrics().width("Back")
        self.backLabel.move((w/2) - (backW/2), h/2)

        self.backEdit.move(50, h/2 + 40)
        self.backEdit.resize(w-100, h/3)

Извиняюсь за всеобщую небрежность, я новичок в PyQt и в целом в программировании GUI. В любом случае, формулы, которые я использовал для изменения размера и перемещения виджетов, совершенно произвольны. Кто-нибудь знает лучший способ достижения этого эффекта?

1 Ответ

0 голосов
/ 06 января 2019

Попробуйте:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore    import *
from PyQt5.QtGui     import *

class CreatePage(QWidget):
    def __init__(self, parent=None):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.homeBtn = QPushButton("Home") 

        self.frontLabel = QLabel("Front") 
        self.frontLabel.setFont(QFont("Decorative", 20))
        self.frontEdit = QTextEdit(placeholderText="frontEdit") 
        self.frontEdit.setFont(QFont("Decorative", 11))

        self.backLabel = QLabel("Back") 
        self.backLabel.setFont(QFont("Decorative", 20))
        self.backEdit = QTextEdit(placeholderText="backEdit") 
        self.backEdit.setFont(QFont("Decorative", 11))

        grid = QGridLayout()
        grid.addWidget(self.homeBtn,    0, 0, alignment=Qt.AlignTop | Qt.AlignLeft)
        grid.addWidget(self.frontLabel, 1, 0, alignment=Qt.AlignCenter)
        grid.addWidget(self.frontEdit,  2, 0)
        grid.addWidget(self.backLabel,  3, 0, alignment=Qt.AlignCenter)
        grid.addWidget(self.backEdit,   4, 0)

        self.setLayout(grid)

if __name__=="__main__":
    app = QApplication(sys.argv)
    myapp = CreatePage()
    myapp.show()
    sys.exit(app.exec_())

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...