LINUX.ORG.RU

Disclamer: Я не спец по Qt.

Для Виндоуса использую ::FlashWindow((HWND)winId(), false);

То есть в виндах в Qt тоже подсвечивание не работает и ты лезешь в Window API (или как оно там сейчас называется?). В иксах, если делать напрямую, это делается через свойство окна WM_HINTS (см. Urgency, определено в ICCCM).

QApplication::alert(this); не помогает.

А что должно быть? Как надо? Вот описание говорит:

void QApplication::alert(QWidget *widget, int msec = 0)

Causes an alert to be shown for widget if the window is not the active window. The alert is shown for msec miliseconds. If msec is zero (the default), then the alert is shown indefinitely until the window becomes active again.

On X11, this will cause the window to be marked as «demands attention», the window must not be hidden (i.e. not have hide() called on it, but be visible in some sort of way) in order for this to work.

If msec is zero (the default), then the alert is shown indefinitely until the window becomes active again.

То есть если оно активно у тебя, то alert тут же и сбрасывается. А как тебе надо?

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

То есть в виндах в Qt тоже подсвечивание не работает и ты лезешь в Window API

В виндоусе я тоже не вижу никакого эффекта от QApplication::alert.

::FlashWindow в виндоусе срабатывает, когда неактивно. В линуксе я пытаюсь добиться такого же эффекта.

Любое решение мне подойдёт, в том числе вызов системной команды.

user08
() автор топика
Последнее исправление: user08 (всего исправлений: 5)
Ответ на: комментарий от user08

В виндоусе я тоже не вижу никакого эффекта от QApplication::alert.

Надо будет глянуть, как она реализована в зависимости от платформы. Вполне возможно, что уже никак вообще не реализована. Стоит какая-то затычка, и все. Вообще, насколько я сейчас знаю, все функции, касающиеся специфики оконных менеджеров, вынесены теперь в KWindowSystem. Там точно есть «подсвечивание» окна. Все специфичные для оконных менеджеров, включая работу с WM_HINTS, выносят из Qt в KWindowSystem.

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

Посмотри сорцы alert в чём проблем то? Если для пинды там FlashWindow используется, то увидишь чего используется для онтопика.

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

Надо будет глянуть, как она реализована в зависимости от платформы. Вполне возможно, что уже никак вообще не реализована.

Нет, реализована вроде. В root/src/plugins/platforms/xcb/qxcbwindow.cpp:

void QXcbWindow::setAlertState(bool enabled)
{
    if (m_alertState == enabled)
        return;

    m_alertState = enabled;

    changeNetWmState(enabled, atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION));
}

void QXcbWindow::changeNetWmState(bool set, xcb_atom_t one, xcb_atom_t two)
{
    xcb_client_message_event_t event;

    event.response_type = XCB_CLIENT_MESSAGE;
    event.format = 32;
    event.sequence = 0;
    event.window = m_window;
    event.type = atom(QXcbAtom::_NET_WM_STATE);
    event.data.data32[0] = set ? 1 : 0;
    event.data.data32[1] = one;
    event.data.data32[2] = two;
    event.data.data32[3] = 0;
    event.data.data32[4] = 0;

    xcb_send_event(xcb_connection(), 0, xcbScreen()->root(),
                   XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT,
                   (const char *)&event);
}

Твой оконный менеджер должне поддерживать NetWM (он же EWMH), чтобы это сработало. Причем поддерживать _NET_WM_STATE_DEMANDS_ATTENTION. Какой у тебя оконный менеджер? И проверь еще случай, когда окно не имеет фокуса, но находится на рабочем столе, а не свернуто, а то, судя по описанию, в Qt как-то странно обрабатывают это все. Получается, что если окно в hide, то оно не будет мигать. Это меня смущает. Так сделано на уровне Qt, а не на уровне иксов.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от user08

А что в #include надо написать?

Ничего не надо прописывать, все должно быть само. Плагин Xcb.

У меня Debian 9, KDE.

KWin должен EWMH поддерживать. Может, ты что-то не так делаешь? Покажи людям кусочек кода. И напиши, при каких условиях проверяешь.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Ну например вот так. Нажимаю кнопку и активирую другое окно.

void MainWindow::test()
{
    QThread::msleep(3000);
    QApplication::alert(this);
}

Ничего не надо прописывать, все должно быть само. Плагин Xcb.

Непонятно, как эту функцию использовать. error: ‘QXcbWindow’ has not been declared.

user08
() автор топика
Последнее исправление: user08 (всего исправлений: 1)
Ответ на: комментарий от user08

Для проверки создал новый проект, в MainWindow такой код, всё работает.

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTimer *timer = new QTimer();

    QObject::connect(timer, SIGNAL(timeout()), this, SLOT(timer_alert()));
    timer->start(5000);
}

void MainWindow::timer_alert() {
    QApplication::alert(this);
}
hippi90 ★★★★★
()
Ответ на: комментарий от user08

Непонятно, как эту функцию использовать. error: ‘QXcbWindow’ has not been declared.

Это специфические классы для X11 (QXcb). Когда используется плагин xcb (он, наверное, автоматом выбирается в Qt в иксах), то для alert вызывается метод этого класса окна (реализации окна для X11).

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

Для проверки создал новый проект, в MainWindow такой код, всё работает.

У меня это тоже сработало. Непонятно, почему мой пример не работает.

user08
() автор топика
Ответ на: комментарий от user08

Возможно в случае когда вызывается синхронный sleep - к моменту вызова alert окно ещё не успело обработать сообщение о том, что его переключили и что оно стало неактивно. И ничего не делает, поскольку считает что уже активно.

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