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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Неблокирующее всплывающее окно  (Прочитано 11564 раз)
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #15 : Октябрь 11, 2012, 19:08 »

Да тут задача так стоит... Есть код под arm на железяку, раньше использовалась другая gui либа, решили перейти на qt малой кровью а тут такое... Если будет идея, дайте знать.. Всем еще раз спасибо!
а мне вот интерестно, какая такая GUI либа может отобразить окошко без попадания в цикл обработки сообщений?
Ну и поделу : вынеси свой долгий код в другой поток.
Записан
moskk
Гость
« Ответ #16 : Октябрь 11, 2012, 20:01 »

попробуйте после show ещё repaint вызвать для окна. у меня было что-то похожее.

upd: да, один в один ситуация была. окошко типа "Пожалуйста, подождите", неблокирующее и поверх всех:
Код
C++ (Qt)
void WaitingStateDialog::start()
{
   m_ElapsedTime.restart();
   m_Timer.start();
 
   // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   setWindowModality(Qt::ApplicationModal);
   show();
   repaint();
 
   // исходный вариант
   //exec();
}
« Последнее редактирование: Октябрь 11, 2012, 20:07 от moskk » Записан
irus4
Гость
« Ответ #17 : Октябрь 11, 2012, 23:42 »

а мне вот интерестно, какая такая GUI либа может отобразить окошко без попадания в цикл обработки сообщений?
Ну и поделу : вынеси свой долгий код в другой поток.

Либа обрабатывала запросы в дочернем потоке, с qt нельзя такое сделать, т.к. обработка Gui должна находиться в главном потоке...

попробуйте после show ещё repaint вызвать для окна. у меня было что-то похожее.

upd: да, один в один ситуация была. окошко типа "Пожалуйста, подождите", неблокирующее и поверх всех:
Код
C++ (Qt)
void WaitingStateDialog::start()
{
   m_ElapsedTime.restart();
   m_Timer.start();
 
   // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   setWindowModality(Qt::ApplicationModal);
   show();
   repaint();
 
   // исходный вариант
   //exec();
}

Проверил с repaint() - окно все равно не появляется  В замешательстве
Код:
int main(int argv, char **argc)
{
    QApplication app(argv, argc);

    QDialog le;
    le.show();
    le.repaint();
    sleep(5); // тут окна еще не видно

    return app.exec(); // тут уже видно
}
Записан
mutineer
Гость
« Ответ #18 : Октябрь 12, 2012, 00:07 »

а мне вот интерестно, какая такая GUI либа может отобразить окошко без попадания в цикл обработки сообщений?
Ну и поделу : вынеси свой долгий код в другой поток.

Либа обрабатывала запросы в дочернем потоке, с qt нельзя такое сделать, т.к. обработка Gui должна находиться в главном потоке...

Так пусть гуй работает себе в основном потоке, а код рабочий вынеси в отдельный поток
Записан
FalconHAM
Гость
« Ответ #19 : Октябрь 12, 2012, 09:04 »

Цитировать
с qt нельзя такое сделать, т.к. обработка Gui должна находиться в главном потоке...
Кто сказал?
Например как то так в трэде:
Код:
void DecThread::sPathArc()
{
QDialog dlg;
Ui::pathArcDialog ui;
ui.setupUi(&dlg);
dlg.setFixedSize(dlg.baseSize());

if(dlg.exec() == QDialog::Accepted) {

}
}
Перед экзеком дать сигнал в другой тред на выполнение нудных вычислений.
В этом случае блокируется только главное окно, а события в главном потоке
продолжают обрабатываться.
Да и вообще тут масса решений.
В конце концов замутить с
Цитировать
QMdiSubWindow

ИМХО Улыбающийся

Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #20 : Октябрь 12, 2012, 09:05 »

а мне вот интерестно, какая такая GUI либа может отобразить окошко без попадания в цикл обработки сообщений?
Ну и поделу : вынеси свой долгий код в другой поток.

Либа обрабатывала запросы в дочернем потоке, с qt нельзя такое сделать, т.к. обработка Gui должна находиться в главном потоке...
Шо за люди !? Я тебя что спрашивал про возможности Qt ? Я тебя спрашивал какую либу использовали до сих пор !
Учись читать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Октябрь 12, 2012, 09:47 »

Пытался сделать через QApplication::processEvents, но он не полностью прорисовывает окно, а только рамку(без кнопок и т.д.)
Правильно пытались, но  QApplication::processEvents надо вызывать постоянно (а не 1 раз). Как эти вызовы вставить в код = Ваши проблемы. Вызов app.exec() необязателен, но объект QApplication должен быть создан.

а мне вот интерестно, какая такая GUI либа может отобразить окошко без попадания в цикл обработки сообщений?
Ну и поделу : вынеси свой долгий код в другой поток.
Это нормальное решение, но оно не единственное. Крутить вторичный eventLoop (с помощью processEvents)  также неплохо, а иногда и лучше
Записан
irus4
Гость
« Ответ #22 : Октябрь 12, 2012, 13:37 »

Пытался сделать через QApplication::processEvents, но он не полностью прорисовывает окно, а только рамку(без кнопок и т.д.)
Правильно пытались, но  QApplication::processEvents надо вызывать постоянно (а не 1 раз). Как эти вызовы вставить в код = Ваши проблемы. Вызов app.exec() необязателен, но объект QApplication должен быть создан.

а мне вот интерестно, какая такая GUI либа может отобразить окошко без попадания в цикл обработки сообщений?
Ну и поделу : вынеси свой долгий код в другой поток.
Это нормальное решение, но оно не единственное. Крутить вторичный eventLoop (с помощью processEvents)  также неплохо, а иногда и лучше

Вызываю processEvents в другом потоке:

Код:
class Thread: public QThread
{
Q_OBJECT

protected:
    void run()
    {
        while(true)
        {
            std::cout<<"process events"<<std::endl;
            QApplication::processEvents();
        }
    }
};

В main запускаю поток и создаю экран:

Код:
int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    Thread thread;
    thread.start();

    QDialog dial;
    dial.setWindowTitle("Test");
    dial.show();
    sleep(15);
}

Жду 15 секунд, экран так и не появился...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #23 : Октябрь 12, 2012, 13:40 »

Жду 15 секунд, экран так и не появился...
Мде...
А что, разве не видно что после sleep(15); приложение закроется Непонимающий
Может стоит чем-нибудь другим заняться?
Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Октябрь 12, 2012, 13:46 »

Вызываю processEvents в другом потоке:
...
Жду 15 секунд, экран так и не появился...
QApplication::processEvents работает "для текущего потока", поэтому конечно не появится  Улыбающийся Вы сделали "2 техники вместе", это не работает, выберите одну, напр

Код
C++ (Qt)
#include <QtGUI>
 
int main( int argc, char **argv )
{
QApplication app(argc, argv);
QDialog dlg;
QLabel * lab = new QLabel("Test", &dlg);
dlg.show();
 
while (true) {
DoSomething();
QApplication::processEvents();
}
return 0;
}
 
Это ничем не хуже чем "с потоком" (что так усиленно рекомендуют  Улыбающийся)  
Записан
irus4
Гость
« Ответ #25 : Октябрь 12, 2012, 13:50 »

Igors, спасибо большое. Только вот логика не совсем мне подходит, т.к. в DoSomething может выполняться долго и до processEvents код может так и не дойти, а в DoSomething должны создавать различные экраны и т.д.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #26 : Октябрь 12, 2012, 13:51 »

Мне кажется, что мы здесь все отвечающие просто зря теряем время, ибо ТС понятия не имеет что такое
Событийно-ориентированное программирование Грустный
Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #27 : Октябрь 12, 2012, 14:07 »

Igors, спасибо большое. Только вот логика не совсем мне подходит, т.к. в DoSomething может выполняться долго и до processEvents код может так и не дойти, а в DoSomething должны создавать различные экраны и т.д.
Вы можете заменить весь цикл на 1 вызов DoSomething - тогда Вам надо натыкать processEvents внутрь этой ф-ции так чтобы оно вызывалось достаточно часто (UI не замерзало). Если (наверняка) у Вас больше ф-ций - ну натыкать во все. Ничего страшного в этом нет, все равно отображать "прогресс" придется.

В варианте с потоком этих проблем нет, но зато есть другие - напр Вы не сможете создавать там окна, придется городить сигналы для каждого действия с UI. Смотрите что Вам выгоднее по задаче, ну и теорию почитывайте (иногда  Улыбающийся)   
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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