Vra

Ek het 'n QMainWindow in 'n Qt aansoek. Toe ek sluit dit Ek wil dit aan sy huidige herstel grootte (die grootte van die venster wanneer dit nie gemaksimeer) te stoor. Dit werk goed as ek die venster in te herstel af (dit is, nie benut word) te sluit. Maar as ek die venster toemaak as dit maksimeerd, dan volgende keer as ek begin die aansoek en die herstel van die aansoek (want dit begin in om maksimum modus), dan beteken dit nie onthou die grootte dit moet herstel. Is daar 'n manier om dit te doen?

Was dit nuttig?

Oplossing

Gebruik die QWidget :: saveGeometry funksie om die huidige te skryf instellings in die register. (die register is toeganklik met behulp van QSettings). Gebruik dan restoreGeometry () op opstart om terug te keer na die vorige staat.

Ander wenke

Ek het gevind dat 'n kombinasie van al die vorige antwoorde hier nodig was op Fedora 14. Wees versigtig nie om die grootte en posisie te red wanneer die venster gemaksimeer!

void MainWindow::writePositionSettings()
{
    QSettings qsettings( "iforce2d", "killerapp" );

    qsettings.beginGroup( "mainwindow" );

    qsettings.setValue( "geometry", saveGeometry() );
    qsettings.setValue( "savestate", saveState() );
    qsettings.setValue( "maximized", isMaximized() );
    if ( !isMaximized() ) {
        qsettings.setValue( "pos", pos() );
        qsettings.setValue( "size", size() );
    }

    qsettings.endGroup();
}

void MainWindow::readPositionSettings()
{
    QSettings qsettings( "iforce2d", "killerapp" );

    qsettings.beginGroup( "mainwindow" );

    restoreGeometry(qsettings.value( "geometry", saveGeometry() ).toByteArray());
    restoreState(qsettings.value( "savestate", saveState() ).toByteArray());
    move(qsettings.value( "pos", pos() ).toPoint());
    resize(qsettings.value( "size", size() ).toSize());
    if ( qsettings.value( "maximized", isMaximized() ).toBool() )
        showMaximized();

    qsettings.endGroup();
}

In main (), die posisie instellings gelees voor wat die venster die eerste keer ...

MainWindow mainWindow;
mainWindow.readPositionSettings();
mainWindow.show();

... en hierdie gebeurtenis hanteerders werk die instellings as wat nodig is. (Dit veroorsaak 'n skryf aan die instellings in te dien vir elke muis beweging tydens die skuif en die grootte wat nie ideaal is.)

void MainWindow::moveEvent( QMoveEvent* )
{
    writePositionSettings();
}

void MainWindow::resizeEvent( QResizeEvent* )
{
    writePositionSettings();
}

void MainWindow::closeEvent( QCloseEvent* )
{
    writePositionSettings();
}

Maar die vertikale komponent van die posisie is nie heeltemal reg, dit blyk te wees ignoreer die hoogte van die venster titel bar ... as iemand weet hoe om dit te hanteer wat my laat weet:)

Ek het hierdie probleem ondervind as well.

Wat jy kan doen: bykomend tot die grootte van die venster se nie, behalwe of dit gemaksimaliseer of nie (QWidget::isMaximized()).

Toe volgende keer as jy die aansoek begin, eers die grootte (QWidget::resize()) en maksimeer dit dan indien nodig (QWidget::showMaximized()). Wanneer dit herstel, moet dit terug te keer na die regte grootte.

Die beeld by http://qt-project.org/doc /qt-4.8/application-windows.html shows, wat geometry.x() en geometry.y() is nie gelyk aan x() en y(), wat dieselfde as pos() is.

In my geval, gebruik ek:

x()
y()
width()
height()

en die herstel van hierdie suksesvol met:

move()
resize()
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top