Russian Qt Forum
Октябрь 01, 2024, 22:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Взаимодействие главного окна и диалога  (Прочитано 8274 раз)
AlekseyK
Гость
« : Август 04, 2011, 12:06 »

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

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Август 04, 2011, 12:09 »

Цитировать
Через определённые промежутки времени выскакивает StayOnTop диалог (parent = 0 у него, чтобы не быть связанным с главным окном) и запрашивает определённые действия пользователя.
Выскакивает через exec() или show()?
Записан

Qt 5.11/4.8.7 (X11/Win)
AlekseyK
Гость
« Ответ #2 : Август 04, 2011, 12:16 »

exec()
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Август 04, 2011, 12:17 »

exec()
Пробуй через show().
Записан

Qt 5.11/4.8.7 (X11/Win)
AlekseyK
Гость
« Ответ #4 : Август 04, 2011, 12:53 »

Тоже самое.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Август 04, 2011, 12:55 »

А если спробовать назначить парентом то окно которое нужно поставить активным после завершения?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Август 04, 2011, 12:56 »

Тоже самое.
Показывай тогда как создаёшь ентот StayOnTop диалог.
Записан

Qt 5.11/4.8.7 (X11/Win)
AlekseyK
Гость
« Ответ #7 : Август 04, 2011, 13:02 »

А если спробовать назначить парентом то окно которое нужно поставить активным после завершения?
Каким образом??? Подмигивающий  У меня как бы сервисное приложение, которое должно висеть в фоне и не мозолить глаза. Т.е. пользователь работает с ЛЮБЫМИ своими программами и после завершения диалога должен к ним и вернуться.
Записан
AlekseyK
Гость
« Ответ #8 : Август 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);
}
 
Записан
AlekseyK
Гость
« Ответ #9 : Август 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
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Август 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();
}
 
Записан

Qt 5.11/4.8.7 (X11/Win)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #11 : Август 11, 2011, 12:29 »

на маке видно как главное окошко сначала появляется, а потом сразу сворачивается. при активном другом приложении иконка в доке начинает постоянно скакать, при нажатии на нее - показывается диалог. setWindowFlags(Qt::WindowStaysOnTopHint) помог только при первом показе, в дальнейшем диалог не висит поверх всех окон.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Август 11, 2011, 13:39 »

У меня дома в виндозе включено focus follows mouse, при этом политика отслеживания фокуса и работы с окнами у виндозы сильно меняется. Фокус может попасть даже в перекрытое окно, без необходимости его подъема наверх - то есть, можно вводить данные в поля формы, которая частично перекрыта. Так вот, если при этом Qt-приложение создает немодальное окно, то оно выскакивает поверх всех окон, но если само это приложение перекрыто, то оно не поднимается под созданное им окно, так и остается перекрытым. Пришлось даже специально его поднимать сначала для случаев такой настройки.
Записан

2^7-1 == 127, задумайтесь...
AlekseyK
Гость
« Ответ #13 : Август 14, 2011, 10:58 »

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

Хмм... В винде работает по всякому, в Линуксе пока не захотело, хотя пример "Windows Flags" работает. Сравню значения флагов.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.185 секунд. Запросов: 22.