Qt: как сделать mainWindow автоматически изменяющим размер при изменении размера centralwidget? - PullRequest
7 голосов
/ 19 марта 2012

Я бы хотел, чтобы мой CentralWidget был определенного размера.Что мне нужно сделать, чтобы изменить размер главного окна в соответствии с его центральным виджетом?здесь код, который не работает:

int main (int argc, char **argv) {
    QApplication app(argc, argv);

    QGLFormat glFormat;
    glFormat.setVersion(4,2);
    glFormat.setProfile( QGLFormat::CompatibilityProfile);

    QGLWidget* render_qglwidget = new MyWidget(glFormat);

    QGLContext* glContext = (QGLContext *) render_qglwidget->context();
    glContext->makeCurrent();


    QMainWindow* mainWindow = new MyMainWindow();
    render_qglwidget->resize(720, 486);
    mainWindow->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding));
    mainWindow->setCentralWidget(render_qglwidget);

    render_qglwidget->resize(720, 486);

    mainWindow->show();

    return app.exec();
}

окно, которое открывается, будет очень маленьким.

я могу установить размер главного окна, используя

 mainWindow->resize(720, 486);

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

Как разрешить автоматическому изменению размера главного окна?

Ответы [ 4 ]

1 голос
/ 19 марта 2012

Вы можете переопределить QMainWindow::event() для автоматического изменения размера окна при каждом изменении размера центрального виджета:

bool MyMainWindow::event(QEvent *ev) {
    if(ev->type() == QEvent::LayoutRequest) {
        setFixedSize(sizeHint());
    }
    return result = QMainWindow::event(ev);
}

Вы также должны использовать setFixedSize() для центрального виджета вместо просто resize(),Последнее почти бесполезно, когда виджет размещен внутри макета (который здесь QMainWindowLayout).

0 голосов
/ 22 мая 2013

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

def centralWidgetResize(self, x, y):
    # If the window is not visible, it doesn't keep its layout up to date, so force it.
    if not self.isVisible():
      self.layout().update()
    # Does nothing if the layout is already up to date (and the window is visible).
    self.layout().activate()
    size = self.size()
    childsize = self.centralWidget().size()
    dx = size.width() - childsize.width()
    dy = size.height() - childsize.height()
    self.resize(x + dx, y + dy)

Это Python, но код C ++ должен быть простым переводом.Это также работает со странными размещениями панели инструментов или несколькими панелями инструментов.Обратите внимание, что фактическое обновление размера происходит только тогда, когда отображается окно, если оно необходимо немедленно и окно скрыто, выполните еще один layout().update(); layout().activate().

0 голосов
/ 19 марта 2012

Невозможно установить размер QMainWindow на основе его центрального виджета.Это всегда наоборот.

Как вы сказали, используйте QMainWindow::resize(), добавляя панель инструментов и высоту строки состояния к вашему центральному виджету, чтобы получить окончательный результат.

Также обязательно измените размерв «отложенной инициализации» (т. е. QTimer с таймаутом 0), чтобы высота панели инструментов и строки состояния были точными.

Если вы хотите, чтобы ваше главное окно не изменялось пользователем,используйте QMainWindow::setWindowFlags(Qt::FramelessWindowHint), чтобы отключить изменение размера путем перетаскивания мышью.

0 голосов
/ 19 марта 2012

Установить размер центрального виджета.Затем получите подсказку по размеру для главного окна и установите его размер.

(sizeHint (), setFixedSize ()).

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