PyQt5 фактический размер QFrame

Есть ли способ получить фактический размер QFrame в PyQt5? Разрешение моего монитора 1920х1080. После того, как я добавил QFrame в макет, он заполняет все окно в моем случае около 1200 пикселей. Однако команда width() возвращает 640. Кажется, размер по умолчанию 640x480, и он не меняется при запросе?

Я хочу иметь возможность центрировать виджет без использования макетов, потому что я планирую использовать несколько наложений в своем дизайне.

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

class MainWindow(QMainWindow):

   def __init__(self, parent):

    QMainWindow.__init__(self, parent)
    self.setWindowTitle('Sample')
    size_object = PyQt5.QtWidgets.QDesktopWidget ().screenGeometry ( -1 )  # active screen
    scr_width = size_object.width ()
    scr_height = size_object.height()
    self.resize ( 3 / 4 * scr_width, 3 / 4 * scr_height )

    qr = self.frameGeometry()  # geometry of the main window
    cp = QDesktopWidget().availableGeometry().center()  # center point of screen
    qr.moveCenter(cp)  # move rectangle's center point to screen's center point
    self.move(qr.topLeft())  # top left of rectangle becomes top left of window centering it

    self.setCentralWidget ( QWidget ( self ) )
    self.hbox = QHBoxLayout ()
    self.centralWidget ().setLayout ( self.hbox )

    self.frame_sample = QFrame ()
    self.hbox.addWidget ( self.frame_sample )
    self.frame_sample.setStyleSheet ( "background-color: rgb(200, 100, 255)" )


    button_go = QPushButton ("sample",  self.frame_sample )
    button_go.setStyleSheet (
        'QPushButton {background: red; yellow; font-weight: bold;'
        ' text-decoration: underline; text-align: middle;}' )
    button_go.resize ( 100, 100 )
    button_go.move ( (self.frame_sample.width () - button_go.width ()) / 2,
                     (self.frame_sample.height () - button_go.height ()) / 2 )


app = QApplication ( sys.argv )
myWindow = MainWindow ( None )
myWindow.show ()
app.exec_ ()

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

Я хочу, чтобы кнопка отображалась в середине QFrame на основе рассчитанной позиции.


person goryef    schedule 22.07.2018    source источник
comment
предоставьте минимальный воспроизводимый пример   -  person eyllanesc    schedule 22.07.2018
comment
Qt не может знать истинный размер до того, как оконный менеджер отобразит кадр.   -  person ekhumoro    schedule 22.07.2018
comment
Я пытаюсь разместить виджет в центре QFrame. есть ли способ обойтись без знания истинного размера?   -  person goryef    schedule 22.07.2018
comment
@goryef Какой виджет вы хотите разместить в центре QFrame?   -  person eyllanesc    schedule 23.07.2018
comment
@goryef где ты используешь wndw_width?   -  person eyllanesc    schedule 23.07.2018
comment
@eyllanesc Я хотел бы иметь полный контроль над размером и размещением виджетов. Я знаю о макетах, но хочу иметь возможность размещать виджеты в любом месте. Wind_width в коде просто показывает, что ширина QFrame возвращает значение, намного меньшее, чем кажется визуально. Согласно ответу выше, это b:c, я запрашиваю его до того, как он будет отображен. Мне просто интересно, есть ли какие-то «уловки», чтобы обойти это. Я очень новичок в Python. Весь мой опыт связан с Vb.net.   -  person goryef    schedule 24.07.2018
comment
@goryef В Qt размеры применяются только тогда, когда виджет виден, а конструктор вызывается, когда он еще не виден, если вы спросите о конкретном случае, он может показать вам практический пример.   -  person eyllanesc    schedule 24.07.2018
comment
@goryef Я вижу, что вы никогда не используете wndw_width, поэтому это мой вопрос   -  person eyllanesc    schedule 24.07.2018
comment
@goryef Почему вы говорите, что ширина фрейма должна быть 1440?   -  person eyllanesc    schedule 24.07.2018
comment
@eyllanesc Я ожидаю, что ширина рамки должна быть больше 640 пикселей. я обновил исходный пост с кодом и образцом изображения   -  person goryef    schedule 24.07.2018
comment
@eyllanesc. Я обновляю исходный пост с примером   -  person goryef    schedule 24.07.2018


Ответы (1)


Геометрия не обновляется сразу, так как это связано с затратами, Qt выполняется, когда виджет виден или нуждается в обновлении, в вашем случае расчет должен выполняться при его отображении или при изменении размера виджета.

import sys

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


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setWindowTitle('Sample')
        size_object = QDesktopWidget().screenGeometry(-1)  # active screen
        scr_width = size_object.width ()
        scr_height = size_object.height()
        self.resize ( 3 / 4 * scr_width, 3 / 4 * scr_height )

        qr = self.frameGeometry()  # geometry of the main window
        cp = QDesktopWidget().availableGeometry().center()  # center point of screen
        qr.moveCenter(cp)  # move rectangle's center point to screen's center point
        self.move(qr.topLeft())  # top left of rectangle becomes top left of window centering it

        self.setCentralWidget(QWidget())
        self.hbox = QHBoxLayout(self.centralWidget())

        self.frame_sample = QFrame()
        self.hbox.addWidget(self.frame_sample )
        self.frame_sample.setStyleSheet( "background-color: rgb(200, 100, 255)" )


        self.button_go = QPushButton("sample",  self.frame_sample)
        self.button_go.setStyleSheet(
            'QPushButton {background: red; yellow; font-weight: bold;'
            ' text-decoration: underline; text-align: middle;}' )
        self.button_go.resize (100, 100)

    def event(self, e):
        if e.type() in (QEvent.Show, QEvent.Resize):
            geo = self.button_go.geometry()
            geo.moveCenter(self.frame_sample.rect().center())
            self.button_go.setGeometry(geo)

        return QMainWindow.event(self, e)

if __name__ == '__main__':

    app = QApplication(sys.argv)
    myWindow = MainWindow()
    myWindow.show ()
    sys.exit(app.exec_())

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

person eyllanesc    schedule 24.07.2018
comment
Идеальный! Именно то, что я искал. Спасибо - person goryef; 24.07.2018