Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: AlekseyK от Август 04, 2011, 12:06



Название: Взаимодействие главного окна и диалога
Отправлено: AlekseyK от Август 04, 2011, 12:06
Добрый день! В общем есть такая проблема: главное окно (скажем MyApp) висит в фоне (позади всех окон или вообще в трее), без нужды его показывать не нужно. Через определённые промежутки времени выскакивает StayOnTop диалог (parent = 0 у него, чтобы не быть связанным с главным окном) и запрашивает определённые действия пользователя. После закрытия диалога хотелось бы, чтобы активным так и оставалось окно приложения, с которым в данный момент работает пользователь, и он спокойно продолжал делать свои дела не переключаясь на MyApp. Однако вместо этого на передний план выскакивает главное окно MyApp и приходится постоянно переключаться обратно - неудобно. Как сделать, чтобы MyApp не выскакивало? Поставить какой-нибудь eventFilter или лезть в API ОС? Проблема есть и в маке, и в винде и в линуксе.


Название: Re: Взаимодействие главного окна и диалога
Отправлено: GreatSnake от Август 04, 2011, 12:09
Цитировать
Через определённые промежутки времени выскакивает StayOnTop диалог (parent = 0 у него, чтобы не быть связанным с главным окном) и запрашивает определённые действия пользователя.
Выскакивает через exec() или show()?


Название: Re: Взаимодействие главного окна и диалога
Отправлено: AlekseyK от Август 04, 2011, 12:16
exec()


Название: Re: Взаимодействие главного окна и диалога
Отправлено: GreatSnake от Август 04, 2011, 12:17
exec()
Пробуй через show().


Название: Re: Взаимодействие главного окна и диалога
Отправлено: AlekseyK от Август 04, 2011, 12:53
Тоже самое.


Название: Re: Взаимодействие главного окна и диалога
Отправлено: Igors от Август 04, 2011, 12:55
А если спробовать назначить парентом то окно которое нужно поставить активным после завершения?


Название: Re: Взаимодействие главного окна и диалога
Отправлено: GreatSnake от Август 04, 2011, 12:56
Тоже самое.
Показывай тогда как создаёшь ентот StayOnTop диалог.


Название: Re: Взаимодействие главного окна и диалога
Отправлено: AlekseyK от Август 04, 2011, 13:02
А если спробовать назначить парентом то окно которое нужно поставить активным после завершения?
Каким образом??? ;)  У меня как бы сервисное приложение, которое должно висеть в фоне и не мозолить глаза. Т.е. пользователь работает с ЛЮБЫМИ своими программами и после завершения диалога должен к ним и вернуться.


Название: Re: Взаимодействие главного окна и диалога
Отправлено: AlekseyK от Август 04, 2011, 13:05
Показывай тогда как создаёшь ентот StayOnTop диалог.

Ну примерно так:
Код
C++ (Qt)
KMyReminder::KMyReminder(QWidget * parent, Qt::WindowFlags flags)
: QDialog(parent, flags | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint)
{
ui.setupUi(this);
 
setAttribute(Qt::WA_QuitOnClose, false);
 
setWindowFlags(windowFlags() ^ Qt::Dialog | Qt::Window);
}
 


Название: Re: Взаимодействие главного окна и диалога
Отправлено: AlekseyK от Август 11, 2011, 07:26
Похоже, что реализовать не получится:
http://developer.qt.nokia.com/forums/viewthread/8495/#49421
http://stackoverflow.com/questions/6981101/main-application-window-and-a-dialog-interaction-in-qt


Название: Re: Взаимодействие главного окна и диалога
Отправлено: GreatSnake от Август 11, 2011, 12:14
Странно... У меня с этим ни на X-ах ни на винде (проверял, правда, только на WS2003) таких проблем нет.
Вот пример:
Код
C++ (Qt)
#include <QApplication>
#include <QMainWindow>
#include <QDialog>
#include <QVBoxLayout>
#include <QPushButton>
#include <QTimer>
 
class KMyReminder : public QDialog
{
public:
KMyReminder( QWidget* parent = 0 )
: QDialog( parent )
{
QVBoxLayout* vl = new QVBoxLayout( this );
QPushButton* pb = new QPushButton( "&Close" );
vl->addWidget( pb );
connect( pb, SIGNAL( clicked() ), this, SLOT( accept() ) );
QTimer::singleShot( 5000, this, SLOT( exec() ) );
}
void accept()
{
QDialog::accept();
QTimer::singleShot( 5000, this, SLOT( exec() ) );
}
};
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
QMainWindow w;
 
KMyReminder r;
 
w.showMinimized();
return app.exec();
}
 


Название: Re: Взаимодействие главного окна и диалога
Отправлено: kambala от Август 11, 2011, 12:29
на маке видно как главное окошко сначала появляется, а потом сразу сворачивается. при активном другом приложении иконка в доке начинает постоянно скакать, при нажатии на нее - показывается диалог. setWindowFlags(Qt::WindowStaysOnTopHint) помог только при первом показе, в дальнейшем диалог не висит поверх всех окон.


Название: Re: Взаимодействие главного окна и диалога
Отправлено: Гурман от Август 11, 2011, 13:39
У меня дома в виндозе включено focus follows mouse, при этом политика отслеживания фокуса и работы с окнами у виндозы сильно меняется. Фокус может попасть даже в перекрытое окно, без необходимости его подъема наверх - то есть, можно вводить данные в поля формы, которая частично перекрыта. Так вот, если при этом Qt-приложение создает немодальное окно, то оно выскакивает поверх всех окон, но если само это приложение перекрыто, то оно не поднимается под созданное им окно, так и остается перекрытым. Пришлось даже специально его поднимать сначала для случаев такой настройки.


Название: Re: Взаимодействие главного окна и диалога
Отправлено: AlekseyK от Август 14, 2011, 10:58
Хм, похоже, что в Линуксе и Винде должно работать, судя по примеру Window Flags из QT Demo. На маке не будет так как тут оконный менеждер поднимает следующее окно того же приложения при закрытии предыдущего. Но у меня пока не получается почему-то, надо понять, в чём отличие, может QDialog заменить на QWidget.


Название: Re: Взаимодействие главного окна и диалога
Отправлено: AlekseyK от Август 26, 2011, 16:39
Хмм... В винде работает по всякому, в Линуксе пока не захотело, хотя пример "Windows Flags" работает. Сравню значения флагов.


Название: Re: Взаимодействие главного окна и диалога
Отправлено: AlekseyK от Август 29, 2011, 22:42
Похоже всё дело в настройках оконного менеждера, КДЕ был криво настроен.