LINUX.ORG.RU

Qt 4.2.2 QWorkSpace, координаты


0

0

Господа, вопрос в следующем: пишу MDI приложение, используя объект класса QWorkSpace, вложенные в него окна - наследники QMainWindow. есть необходимость сохранять настройки приложения, а именно: открытые вложенные окна (с этим справился))), а главное их геометрию, т.е. ширину, высоту и координаты левого верхнего угла. с высотой и шириной порядок, а вот координаты какие-то левые. пытался использовать функции x(), y(); pos(); geometry() и далее по списку, но все они возвращают одни и те же координаты, которые явно не соответствуют расположению вложенных окон. судя по всему они возвращают координаты верхнего левого угла самого QWorkSpace, относительно главной формы, на которой тот расположен. Каким образом мне получить вышеупомянутые координаты? P.S. По-моему, загрузка происходит таким же корявым образом, т.е. ширина и высота соответствуют сохраненным, но окна появляются в совершенно "левых" местах.

Restoring a Window's Geometry
Since version 4.2, Qt provides functions that saves and restores a window's geometry and state for you. QWidget::saveGeometry() saves the window geometry and maximized/fullscreen state, while QWidget::restoreGeometry() restores it. The restore function also checks if the restored geometry is outside the available screen geometry, and modifies it as appropriate if it is.
The rest of this document describes how to save and restore the geometry using the geometry properties. On Windows, this is basically storing the result of QWidget::geometry() and calling QWidget::setGeometry() in the next session before calling show(). On X11, this won't work because an invisible window doesn't have a frame yet. The window manager will decorate the window later. When this happens, the window shifts towards the bottom/right corner of the screen depending on the size of the decoration frame. Although X provides a way to avoid this shift, most window managers fail to implement this feature.
A workaround is to call setGeometry() after show(). This has the two disadvantages that the widget appears at a wrong place for a millisecond (results in flashing) and that currently only every second window manager gets it right. A safer solution is to store both pos() and size() and to restore the geometry using QWidget::resize() and move() before calling show(), as demonstrated in the following code snippets (from the Application example):
void MainWindow::readSettings()
{
QSettings settings("Trolltech", "Application Example");
QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
QSize size = settings.value("size", QSize(400, 400)).toSize();
resize(size);
move(pos);
}

void MainWindow::writeSettings()
{
QSettings settings("Trolltech", "Application Example");
settings.setValue("pos", pos());
settings.setValue("size", size());
}
This method works on Windows, Mac OS X, and most X11 window managers.

anonymous
()

И вообще, советую, более детально штудировать Assistant. Более исчерпывающую информацию по вопросам, нежели там, найти инпоссибл. Мой личный опыт меня в этом убедил окончательно.

DenXi
()
Ответ на: комментарий от anonymous

нда, очень напоминает примеры))) но не работает в описанном мной случае. совсем. из геометрии пашут только высота и ширина!!!

ilyagoo
() автор топика

#include <QApplication>
#include <QWorkspace>
#include <QLabel>
#include <QDebug>

class TestWidget : public QWorkspace
{
    public:
        TestWidget();
};

TestWidget::TestWidget() : QWorkspace()
{
    QLabel *l;
    int i;

    for(i = 0;i < 4;i++)
    {
        l = new QLabel;
        l->setText("I didn't read documentation");
        addWindow(l);
    }

    QWidgetList list = windowList();

    i = 0;

    foreach(QWidget *w, list)
    {
        w->parentWidget()->move(0, i);
        w->parentWidget()->resize(150, 60);

        qDebug() << w->parentWidget()->geometry();

        i += 70;
    }
}


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

    TestWidget w;

    w.resize(800, 600);

    w.show();

    return app.exec();
}

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

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

ilyagoo
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.