Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: lana от Октября 06, 2008, 20:27



Название: сделать окно активным
Отправлено: lana от Октября 06, 2008, 20:27
Программа сидит в трее и отслеживает события; событие возникает, появляется окно.
Проблема в том, что появившееся окно не активно и спрятано под окном текущего приложения.
Его можно "поднять" выше всех с помощью Qt::WindowStaysOnTopHint, но как его сделать активным - не пойму.
Подскажите?

(setFocus() и setActiveWindow() не помогают)


Название: Re: сделать окно активным
Отправлено: spirit от Октября 06, 2008, 20:30
и этот метод не работает
Код:
void QWidget::activateWindow () 
?


Название: Re: сделать окно активным
Отправлено: lana от Октября 06, 2008, 20:51
Нет, не помогает.
Уточню. В трее сидит класс (от QSystemTrayIcon), и когда возникает событие случается метод, в котором:

QDialog* f = new QDialog();
f->setWindowFlags(f->windowFlags() | Qt::WindowStaysOnTopHint);
...
f->show();
f->activateWindow(); // даже если добавить

Окно f получается неактивное.

и этот метод не работает
Код:
void QWidget::activateWindow () 
?


Название: Re: сделать окно активным
Отправлено: sLiva от Октября 06, 2008, 21:47
Попробуй перед
Код:
void QWidget::activateWindow()
сделать
Код:
void QWidget::raise()


Название: Re: сделать окно активным
Отправлено: ритт от Октября 06, 2008, 23:08
бла-бла-бла...

Код:
#ifdef Q_OS_WIN
#define _WIN32_WINNT 0x0501
#include <qt_windows.h>
#endif

int main(int argc, char* argv[])
{
#ifdef Q_OS_WIN
AllowSetForegroundWindow(ASFW_ANY);
#endif
//...
затем
Код:
void MyMainWindow::activate()
{
setWindowState(windowState() & ~Qt::WindowMinimized);
raise();
activateWindow();
}


Название: Re: сделать окно активным
Отправлено: lana от Октября 07, 2008, 10:25
"Попробуйте".

Нет. Не работает.

Попробуй перед
Код:
void QWidget::activateWindow()
сделать
Код:
void QWidget::raise()


Название: Re: сделать окно активным
Отправлено: lana от Октября 07, 2008, 10:26
Нет. Не работает.

(кстати, у меня Линукс)

бла-бла-бла...

Код:
#ifdef Q_OS_WIN
#define _WIN32_WINNT 0x0501
#include <qt_windows.h>
#endif

int main(int argc, char* argv[])
{
#ifdef Q_OS_WIN
AllowSetForegroundWindow(ASFW_ANY);
#endif
//...
затем
Код:
void MyMainWindow::activate()
{
setWindowState(windowState() & ~Qt::WindowMinimized);
raise();
activateWindow();
}


Название: Re: сделать окно активным
Отправлено: ритт от Октября 07, 2008, 11:43
предупреждать же надо!
этот код должен работать и под вындецом, и под линухами.
какой дистр? какой используется оконный менеджер/графический сервер?


Название: Re: сделать окно активным
Отправлено: lana от Октября 07, 2008, 12:02
SlackWare 12, KDE 3.5.9, X Window System Version 1.3.0, Qt 4.4.1

предупреждать же надо!
этот код должен работать и под вындецом, и под линухами.
какой дистр? какой используется оконный менеджер/графический сервер?


Название: Re: сделать окно активным
Отправлено: ритт от Октября 07, 2008, 12:46
вот мой код реагирования на клик в трее:
Код:
void MainWindow::trayIconActivated(QSystemTrayIcon::ActivationReason reason)
{
switch(reason)
{
case QSystemTrayIcon::Trigger:
if(isMinimized())
{
setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
}
else if(!isVisible())
{
show();
activateWindow();
}
else
{
hide();
}
break;
case QSystemTrayIcon::DoubleClick:
default:
break;
}
}
если добавить вызов activate() из кода выше, окно ещё и становится активным (с фокусом, над остальными окнами)

давай минимальный компилябельный пример - поэкспериментирую на досуге...


Название: Re: сделать окно активным
Отправлено: lana от Октября 07, 2008, 13:43
"Давайте". Русский язык сложен, не так ли?

Не думаю, что Вы можете помочь в этом вопросе. Спасибо за попытку.

вот мой код реагирования на клик в трее:
Код:
void MainWindow::trayIconActivated(QSystemTrayIcon::ActivationReason reason)
{
switch(reason)
{
case QSystemTrayIcon::Trigger:
if(isMinimized())
{
setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
}
else if(!isVisible())
{
show();
activateWindow();
}
else
{
hide();
}
break;
case QSystemTrayIcon::DoubleClick:
default:
break;
}
}
если добавить вызов activate() из кода выше, окно ещё и становится активным (с фокусом, над остальными окнами)

давай минимальный компилябельный пример - поэкспериментирую на досуге...


Название: Re: сделать окно активным
Отправлено: ритт от Октября 07, 2008, 14:32
/mе ощущает себя обгаженным...


Название: Re: сделать окно активным
Отправлено: lit-uriy от Октября 07, 2008, 14:59
2 lana
[off]Все очень просто, слова "Давай" и "Давайте" оба из русского языка, одно в единственном числе, другое во множественном.[/off]


Название: Re: сделать окно активным
Отправлено: ритт от Октября 07, 2008, 14:59
мм...ну, собственно, /* ап-чхи */ главное, что у меня всё работает как требуется...

в русском языке самое сложное - пунктуация...сложные обороты - это вообще караул...
Цитировать
Уточню. В трее сидит класс (от QSystemTrayIcon), и когда возникает событие случается метод, в котором:


Название: Re: сделать окно активным
Отправлено: lana от Октября 07, 2008, 15:22
Вы пребываете в неведении.
(Что меня не удивляет)

2 lana
[off]Все очень просто, слова "Давай" и "Давайте" оба из русского языка, одно в единственном числе, другое во множественном.[/off]



Название: Re: сделать окно активным
Отправлено: ритт от Октября 07, 2008, 15:40
[offtop]
действительно, чему тут удивляться? он же холоп, деревенщина...от бабушки ушёл, от медведя ушёл...
на печке недавно раскатывал - дурачок, одним словом...
[/offtop]

Перестаньте флудить.
Буду удалять.


Название: Re: сделать окно активным
Отправлено: pastor от Октября 07, 2008, 16:34
Нет, не помогает.
Уточню. В трее сидит класс (от QSystemTrayIcon), и когда возникает событие случается метод, в котором:

QDialog* f = new QDialog();
f->setWindowFlags(f->windowFlags() | Qt::WindowStaysOnTopHint);
...
f->show();
f->activateWindow(); // даже если добавить

Окно f получается неактивное.

1. Попробывать указать парент для диалога

Цитировать
Note that QDialog (an any other widget that has type Qt::Dialog) uses the parent widget slightly differently from other classes in Qt. A dialog is always a top-level widget, but if it has a parent, its default location is centered on top of the parent's top-level widget (if it is not top-level itself). It will also share the parent's taskbar entry.

Если

f->show();

небудет работать, то попробывать

f->show();
f->raise();

2. Можно попробывать воспользоваться вместо f->show(); методом f->exec();


Ну и наконец, если ничего не получиться, приаттачить минимальный компилябельный пример (как говорил Константин)


Название: Re: сделать окно активным
Отправлено: lana от Октября 07, 2008, 16:38
Почему Вы защищаете невежество? Почему в своей защите используете нелояльный аргумент "сведение к гротеску"? Назвала ли я его "дурачком" или Вы?

"Злу должно быть, но горе тому, через кого оно приходит" (Евангелие)

Вы встаёте не на ту сторону.
Удаляйте.

[offtop]
действительно, чему тут удивляться? он же холоп, деревенщина...от бабушки ушёл, от медведя ушёл...
на печке недавно раскатывал - дурачок, одним словом...
[/offtop]

Перестаньте флудить.
Буду удалять.


Название: Re: сделать окно активным
Отправлено: lana от Октября 07, 2008, 16:53
Объект экземпляра класса, который "сидит" в трее, наследован от QSystemTrayIcon.

class MyClass : public QSystemTrayIcon

MyClass "слушает" QTcpSocket, и когда возникает событие, выводит окно, которое оказывается неактивным.
Указать в качестве "парента" некого. Если только окно активного в данный момент приложения (не Qt), но это нужно искать его hWND, что, насколько я понимаю, проблематично.

Поэтому же бессмысленен raise(); а show() и exec() одинаково ничего не меняют.

1. Попробывать указать парент для диалога
....


Название: Re: сделать окно активным
Отправлено: ритт от Октября 07, 2008, 17:03
Код:
connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayIconActivated(QSystemTrayIcon::ActivationReason)));
//...

void MainWindow::trayIconActivated(QSystemTrayIcon::ActivationReason reason)
{
switch(reason)
{
case QSystemTrayIcon::Trigger:
{
QDialog* f = new QDialog(this);
f->setWindowFlags(f->windowFlags() | Qt::WindowStaysOnTopHint);

f->show();
//f->setWindowState(windowState() & ~Qt::WindowMinimized);
f->raise();
f->activateWindow();
}
default:
break;
}
}

работает


Название: Re: сделать окно активным
Отправлено: spirit от Октября 07, 2008, 17:07
тут фишка в другом как я понял. виджетов вообще нет.
в main создается предок QSystemTrayIcon.
а ваш пример, Константин, рабочий на 100%.


Название: Re: сделать окно активным
Отправлено: ритт от Октября 07, 2008, 17:19
ну, не вопрос - диалог же всё-равно создаётся? пусть он создаётся в мэйне и сидит невидимым, а потом его оп - показали, оп - скрыли...проблема?
хотя, о чём это я? конечно же, надо искать текущее активное окно (если оно есть), получать его hWnd (это под иксами-то!) и назначить его парентом нового диалога, хотя диалог не примет ид в качестве родителя...ну, какая разница? не примет - и не надо...

klogshow


Название: Re: сделать окно активным
Отправлено: Tonal от Октября 07, 2008, 20:27
HWND - это чисто виндовский прикол, в других оконных системах как уже сазали.
А указывать окно из другого приложения в качестве родителя - это конечно сильно! :D

Я бы попробывал запускать диалог через exec(), и дополнительно через QTimer::singleShot(0, ...) вызвать activateWindow(), или крутануть перед ним processEvents.

[off]
2 lana По поводу "зла" и "неведения".
Вы конечно же слышали, известную мудрость про уставы и монастыри?
Так вот, на большинстве программистских форумах, и этот не исключение, принято общение именно на Ты - этим как бы подчёркивается общность профессионалов.
Обращение на Вы, в таких форумах, обычно имеет место когда индивид показал себя заносчивым, неадекватным и непрофессиональным. Т.е. сообщество как бы отделяет его этим Вы.
Ну и второй вариант, когда появляется "истиный гуру". Например если здесь появится Страуструп, то думаю что обращаться к нему будут в основном на Вы. :)
Но, т.к. здесь свободное общение, Вы, конечно, сами выбираете как к Вам будут относиться и обращаться. :)


Название: Re: сделать окно активным
Отправлено: lana от Октября 07, 2008, 21:12
Это кроссплатформенное приложение, которое используется, в основном, на Win-платформах, но "ковыряюсь" в нём я на линуксе. Если Вы хотели уязвить меня своим замечанием, то меня это мало волнует.

По поводу "зла" и "неведения".
Мне плевать на ваши "монастыри" и детсадовские правила. Я вижу в "тыкании" фамильярность и лицемерие, не более.

HWND - это чисто виндовский прикол, в других оконных системах как уже сазали.

[off]
2 lana По поводу "зла" и "неведения".


Название: Re: сделать окно активным
Отправлено: Tonal от Октября 07, 2008, 22:12
Правильным является разрабатывать приложение в той системе, где приложение будет в основном использоваться - меньше будет в дальнейшем разнообразных неожиданностей. :)

[off]
"Злу должно быть, но горе тому, через кого оно приходит" (Евангелие)
Вы встаёте не на ту сторону.
Правда же гармонирует с:
Мне плевать на ваши "монастыри" и детсадовские правила...
Нам в общем то тоже плевать на твои детские комплексы. :)
[/off]


Название: Re: сделать окно активным
Отправлено: lana от Октября 07, 2008, 22:23
"Кроссплатформеное" - означает, что приложение будет использоваться в разных "системах", и работать оно должно везде и одинаково.

Остальные слова - месть обиженного мальчика. Проще защищать своё невежество, уводя внимание от проблемы, вместо того, чтобы решить её.
Держиморда может закрыть ветку, не думаю, что здесь есть специалисты высокого уровня, способные ответить на вопрос.

Правильным является разрабатывать приложение в той системе, где приложение будет в основном использоваться - меньше будет в дальнейшем разнообразных неожиданностей. :)


Название: Re: сделать окно активным
Отправлено: ритт от Октября 07, 2008, 22:38
я хотел бы уточнить у столь просвящённой особы: каким образом в "тыкании" проявляется лицемерие? ну, фамильярность - хрен с ним - людям с завышенной самооценкой может быть неприятно, когда к ним обращаются на "ты" (к примеру, "Мы - Король"), а лицемерие-то?

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


"Есть учения, которые дают несколько различных подходов к своему предмету. Одним – начинающим – они предлагают основы, более способным и любопытным – углубленную и детальную информацию, не уступающую научным исследованиям. Вы знали об этом? Прочтите, например, документацию по QT и согласитесь со мной, либо не согласитесь."
я извиняюсь за то, что несколько вольно адаптировал столь глубокую мысль под наши мирские суеты, но во всём существуют правила.
пусть на правила форума наплевать, пусть "устав нашего монастыря" будет посмешищем...пусть.
честное слово, нам от этого не станет хололднее или голоднее - примерно раз в пол-года здесь неизменно появляется некий Индивид, Король, Жёлтый робот, наконец, и практически в 100% это люди невежественные и в программировании примерно как свиньи в церкви...
сначала они угрожают, со временем притихают, а потом и вовсе пропадают неизвестно куда...а мы всё ещё тёплые, сытые и продолжаем общение...

счастливых поисков бОГА.
и просьба с такими настроениями здесь больше не писать!


Название: Re: сделать окно активным
Отправлено: ритт от Октября 07, 2008, 22:39
"держиморда" принципиально пока не будет закрывать ветку.

решение было предоставлено ещё на предыдущей странице, но пелена самосозерцания не даёт этого увидеть.
прискорбно...


Название: Re: сделать окно активным
Отправлено: Пантер от Октября 07, 2008, 23:18
Константин: Я так думаю, не стоит закрывать данную ветку, так как автор начнет кричать, что на форуме слишком самоуправные и тупые админы. Следует ее не только оставить, но и в правила внести пару выдержек отсюда. :)

lana: Перед тем, как наезжать на человека в незнакомом обществе, нужно сначала освоиться в данном обществе. Как-то некрасиво наблюдать такой наезд на админа от какого-то новичка. Причем наезд был не оправданный.


Название: Re: сделать окно активным
Отправлено: xintrea от Октября 08, 2008, 01:34
Не смог удержаца чтоб не отписаться.

Кратко про йусера lana могу сказать, что это либо ппц, либо особоутонченный троллинг.


Название: Re: сделать окно активным
Отправлено: Admin от Октября 08, 2008, 08:05
тема закрыта!