2012-03-18 22 views
6

Me gustaría tener un tamaño de mi CentralWidget. ¿Qué debo hacer para cambiar el tamaño de mi mainWindow a lo largo de su widget central? aquí el código que no funciona:Qt: ¿cómo hacer que mainWindow cambie automáticamente el tamaño cuando se cambie el tamaño del widget central?

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(); 
} 

la ventana que se abre será muy pequeña.

i puede establecer el tamaño de la MainWindow usando

mainWindow->resize(720, 486); 

y la centralwidget también cambiará su tamaño. pero el widget central quedará ligeramente aplastado porque la barra de herramientas de la ventana principal también se encuentra dentro de esos 486 píxeles.

¿Cómo dejar que mainWindow cambie el tamaño automáticamente?

Respuesta

0

Establezca el tamaño del widget central. A continuación, obtenga el tamaño de la ventana principal y configúrelo según su tamaño.

(sizeHint(), setFixedSize()).

+0

gracias. si agrego mainWindow-> setFixedSize (hint.width(), hint.height()); por alguna razón, la ventana nunca se abre – Mat

+0

@Mat ¿Ha llamado a set 'mainWindow-> setFixedSize (hint)' después de 'setCentralWidget'? – alexisdm

+0

yes - 1. mainWindow-> setCentralWidget, 2. centralWidget-> resize(), 3. mainwindow-> setFixedSize (sugerencia), 4.mainWindow-> show(). el 3. paso hace que la ventana no aparezca (aparece si comento el paso 3) – Mat

0

No es posible establecer el tamaño de QMainWindow en función de su widget central. Siempre es al revés.

Como dijo, use QMainWindow::resize(), agregando la barra de herramientas y la altura de la barra de estado a su widget central para obtener el resultado final.

Asegúrese también de cambiar el tamaño en un "inicio demorado" (es decir, un QTimer con un tiempo de espera de 0), de modo que la altura de la barra de herramientas y la barra de estado sean precisas.

Si desea que la ventana principal no se pueda reajustar por el usuario, use QMainWindow::setWindowFlags(Qt::FramelessWindowHint) para desactivar el cambio de tamaño arrastrando el mouse.

+0

thx. si pongo setWindowFlags (Qt :: FramelessWindowHint) no puedo cambiar el tamaño con el mouse, pero tampoco puedo mover el borde de la ventana. Me gustaría prohibir el cambio de tamaño con el mouse pero permitir mover el borde de la ventana. ¿como hacer eso? – Mat

1

Puede reimplementar QMainWindow::event() cambiar el tamaño de la ventana de forma automática cada vez que el tamaño de los cambios centrales de widgets:

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

También tiene que utilizar setFixedSize() para el widget central en vez de simplemente resize(). Este último es casi inútil cuando el widget se coloca dentro de un diseño (que es un QMainWindowLayout aquí).

+0

esto hace que la ventana principal aparezca por un momento (pequeño) y se cierre al instante – Mat

+0

@Mat He editado mi respuesta, usando setFixedSize también debería funcionar con la solución NFRCR. – alexisdm

0

Utilicé el siguiente código para resolver un problema similar. Quería redimensionar explícitamente mi ventana principal para que el widget central tenga un tamaño determinado.

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) 

Es Python pero el código C++ debe ser una traducción directa. También funciona con ubicaciones de barras de herramientas extrañas o barras de herramientas múltiples. Tenga en cuenta que la actualización real del tamaño solo ocurre cuando se muestra la ventana, si se necesita de inmediato y la ventana está oculta, haga otro layout().update(); layout().activate().

Cuestiones relacionadas