Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2021, 19:13   #1
alanatolich
Пользователь
 
Регистрация: 26.07.2013
Сообщений: 22
Восклицание PyQt5 компоновка виджетов, Необходимо widget расположить в верху окна, с автоматической шириной по размерам окна.

Здравствуйте, пишу программу на Python, для GUI взялся использовать PyQt5.
Необходимо widget расположить вверху окна, с автоматической шириной по размерам окна.
В Delphi для этого, достаточно указать Align=alTop у визуального объекта.
Помогите с расположением объектов в окне.

Последний раз редактировалось alanatolich; 09.10.2021 в 22:31.
alanatolich вне форума Ответить с цитированием
Старый 09.10.2021, 22:30   #2
alanatolich
Пользователь
 
Регистрация: 26.07.2013
Сообщений: 22
По умолчанию

У QT, Layout Management сделан как-то так по-уродски. Компоновка бывает Horizontal, Vertical, Grid, and Form Layouts. Виджеты располагаются относительно родительского объекта, Горизонтально, Вертикально, Сеткой в виде таблицы, Что-то вроде формы ввода (текст: | поле ввода).

Для решения моей задачи, надо у окна сделать verticalLayout, дочерним элементом, закинуть нужный виджет, сделать у него фиксированную высоту и расширяемую ширину, затем подпереть его снизу другим невидимым виджетом или специальной распоркой verticalSpacer, которые имеют расширяемую высоту, тогда нужный виджет расположиться в верху окна и будет шириной с окно.

В место 2-х действий в редакторе формы Delphi, в Qt Designer потребуется 6 действий.
А я слышал, что у Qt мощнейший Layout Management и в каком месте он мощный?

Последний раз редактировалось alanatolich; 10.10.2021 в 00:36.
alanatolich вне форума Ответить с цитированием
Старый 10.10.2021, 08:19   #3
alanatolich
Пользователь
 
Регистрация: 26.07.2013
Сообщений: 22
Сообщение

Код:
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.MyWidget = QtWidgets.QFrame(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.MyWidget.sizePolicy().hasHeightForWidth())
        self.MyWidget.setSizePolicy(sizePolicy)
        self.MyWidget.setMinimumSize(QtCore.QSize(0, 33))
        self.MyWidget.setStyleSheet("background-color: rgb(0, 170, 127);")
        self.MyWidget.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.MyWidget.setFrameShadow(QtWidgets.QFrame.Raised)
        self.MyWidget.setObjectName("MyWidget")
        self.verticalLayout.addWidget(self.MyWidget)
        self.Podporka = QtWidgets.QFrame(self.centralwidget)
        self.Podporka.setStyleSheet("background-color: rgb(0, 170, 255);")
        self.Podporka.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.Podporka.setFrameShadow(QtWidgets.QFrame.Raised)
        self.Podporka.setObjectName("Podporka")
        self.verticalLayout.addWidget(self.Podporka)
        MainWindow.setCentralWidget(self.centralwidget)

        #self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    '''def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))'''


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
Qt Designer генерирует данный код, где видно что помимо моего (MyWidget) виджета добавляется еще (Podporka-выталкивает мой виджет вверх, centralwidget, verticalLayout, sizePolicy)

Мне кажется что это настолько громоздко и избыточно, в том же Tkinter, было-бы компактнее.

Последний раз редактировалось alanatolich; 10.10.2021 в 08:23.
alanatolich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какая боль сильнее? PrincessMary Свободное общение 20 04.07.2018 07:36
Qt - массивы виджетов роняют программу NataPl Qt и кроссплатформенное программирование С/С++ 3 09.10.2013 12:24
Структура стеки и таблица - это боль retrix147 Общие вопросы C/C++ 2 29.04.2013 15:55
Зависимости виджетов Tema_Crazzzy Общие вопросы C/C++ 3 29.10.2010 10:58