Как правильно восстановить виджеты, размер которых изменен с помощью оснастки Windows 7/Vista Aero.

В Windows 7 есть такая функция: если окно перетаскивается в сторону экрана, оно разворачивается и занимает его половину. Моя проблема в том, что я пытаюсь реализовать восстановление для размера и положения виджета, и когда Windows 7 «максимизирует» виджет, qt по-прежнему возвращает его положение и размер как если бы он все еще отображался нормально, т.е. - полностью неправильное положение и размер.

Есть ли какой-либо контроль над этим в qt5? Я не могу найти его нигде в документах, и это странно


person Zeks    schedule 24.04.2014    source источник


Ответы (1)


Это, по сути, то, что я в итоге сделал. Часть «framegeometry» внизу необходима, чтобы компенсировать границы виджета.

QT += gui-private

необходим в файле .pro для работы приведенного ниже кода

#include <WinUser.h>
#include <qpa/qplatformnativeinterface.h>
static QWindow* windowForWidget(const QWidget* widget)
{
    QWindow* window = widget->windowHandle();
    if (window)
        return window;
    const QWidget* nativeParent = widget->nativeParentWidget();
    if (nativeParent)
        return nativeParent->windowHandle();
    return 0;
}
#include <QWindow>
static HWND getHWNDForWidget(const QWidget* widget)
{
    QWindow* window = ::windowForWidget(widget);
    if (window && window->handle())
    {
        QPlatformNativeInterface* natInterface = QGuiApplication::platformNativeInterface();
        return static_cast<HWND>(natInterface->nativeResourceForWindow(QByteArrayLiteral("handle"), window));
    }
    return 0;
}
void SaveSize(QWidget* w)
{
    QSize size;
    QPoint pos;
    RECT pRect = { 0 };
    HWND hwnd = getHWNDForWidget(w);
    GetWindowRect(hwnd, &pRect);
    auto left = w->frameGeometry().left();
    auto right = w->frameGeometry().right();
    auto width = w->width();
    pos.setX(pRect.left);
    pos.setY(pRect.top);
    size.setWidth(pRect.right - pRect.left - (right - left - width));
    size.setHeight(pRect.bottom - pRect.top);
    //.... the rest of the code
}
person Zeks    schedule 03.05.2014