Разверните и сверните кнопки в отстыкованном QDockWidget - PullRequest
0 голосов
/ 25 мая 2018

Я пытался добавить кнопки в открепленное окно QDockWidget, как это обычно делается для QDialog, но безуспешно, как указано ниже:

QDockWidget* dw = new QDockWidget(QString("Stream %1").arg(i + 1), this); 
dw->setWindowFlags((dw->windowFlags() | Qt::WindowMaximizeButtonHint |
    Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint));

Когда я отсоединяю их, у них все еще есть только[X] кнопка закрытия.

Что мне не хватает?

Информация о среде разработки: Windows 10 x64, Visual Studio 2015, Qt 5.7.1, C ++

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Я разобрался, как это сделать.Вы должны подключиться к сигналу QDockWidget toplevelChanged (bool).

connect(ui.dockWidget, SIGNAL(topLevelChanged(bool)), this, SLOT(dockWidget_topLevelChanged(bool)));

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

void MyClass::dockWidget_topLevelChanged(bool)
{
    QDockWidget* dw = static_cast<QDockWidget*>(QObject::sender());
    if (dw->isFloating())
    {
        dw->setWindowFlags(Qt::CustomizeWindowHint |
            Qt::Window | Qt::WindowMinimizeButtonHint |
            Qt::WindowMaximizeButtonHint |
            Qt::WindowCloseButtonHint);
        dw->show();
    }
}
0 голосов
/ 25 мая 2018

Боюсь, что вы не можете сделать это таким образом, так как QDockWidget выглядит и чувствуется по существу жестко в QStyle, используемом вашим приложением, как указано в документации ( здесь в разделе «Внешний вид»).По сути, QDockWidget - это окно без полей , а строка заголовка и ее структура (заголовок, кнопки и т. Д.) Просто окрашиваются с использованием стиля.

Чтобы преодолеть это, вы можете использовать QProxyStyle для рисования кнопок минимизации и максимизации, но это были бы не "настоящие" кнопки, а только их растровые изображения.Следовательно, вам все равно придется выполнить некоторую переделку для обработки нажатий на эти виртуальные кнопки (например, перехват события click в строке заголовка и определение, произошло ли оно внутри одной из этих кнопок).

Другое возможное решение -чтобы создать подкласс QDockWidget и реализовать всю обработку событий рисования и щелчка там.Помните, что если вы хотите поддерживать несколько платформ, вам может потребоваться использовать QStyle :: drawControl () для рисования дополнительных кнопок вместо того, чтобы рисовать все самостоятельно (например, рисовать растровое изображение).

Я надеюсь, это поможет вам.Удачи в вашем проекте.

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