Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Артем2289
0 / 0 / 0
Регистрация: 20.08.2015
Сообщений: 24
Завершенные тесты: 1
1

Закрыть Qmessagebox через некоторое время

06.10.2016, 10:08. Просмотров 1319. Ответов 27
Метки нет (Все метки)

Всем привет. Столкнулся с небольшой проблемой. Как сделать так, чтобы окно сообщения само закрылось через некоторое время, дело в том, что после выполнения exec я не могу уже ничего выполнить, окно появляется и его только закрыть вручную можно, пробовал создавать новый поток перед exec-ом, который через некоторое время отправит команду close, но мне кажется это неправильно, так как в основном потоке уже происходит цикл обработки окна... Помогите, в какую сторону рыть?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2016, 10:08
Ответы с готовыми решениями:

Вывод значения переменной через QmessageBox
Добрый день. У меня следующий вопрос. Есть такой код вывода ошибки : {if ((R1 < AX) || (R1 >...

Excel: Закрыть книгу через некоторое время
Возможно ли закрыть экселевский файл, если он неактивен какое-то время?

Закрыть форму через некоторое время после её создания
В основном коде программы создаю новую форму Form1 (класс унаследованный от Form). Запускаю форму....

Во время любых игр через некоторое время отключается ноутбук от перегрева
Всем привет, acer aspire e1-571g в последнее время стал выключаться от перегрева спустя некоторое...

Через некоторое время выключается ПК
Случилась такая проблема,установил новую мать,на ней 4 слота под DDR3,установил все 4 слота...

27
solar_wind
763 / 753 / 59
Регистрация: 06.07.2009
Сообщений: 3,002
Завершенные тесты: 1
06.10.2016, 10:37 2
А не проще ли просто создать свое окно с любым сообщением и с таймером......
0
Кудаив
412 / 411 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
06.10.2016, 11:25 3
Артем2289, QTimer::singleShot
0
Артем2289
0 / 0 / 0
Регистрация: 20.08.2015
Сообщений: 24
Завершенные тесты: 1
06.10.2016, 12:00  [ТС] 4
Он выдает ошибку, что Qtimer может быть использован только в потоке... QObject::startTimer: Timers can only be used with threads started with QThread... вот так вот.

to solar_wind: вы имеете ввиду mainwindow?
0
06.10.2016, 12:00
Кудаив
412 / 411 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
06.10.2016, 12:04 5
Артем2289, код покажи, явно делаешь что то не то
0
Артем2289
0 / 0 / 0
Регистрация: 20.08.2015
Сообщений: 24
Завершенные тесты: 1
06.10.2016, 12:11  [ТС] 6
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
int main(int argc, char *argv[])
{
    QApplication art(argc, argv);                
    setlocale(LC_ALL, "russian");              //русский язык
    QMessageBox Text;
    QString a;
    a = a.fromWCharArray(t, -1);
    Text.setText(a);                            //записываем строку в messagebox
    QTimer::singleShot(10000, &Text, SLOT(close()));
    Text.exec();
Вот еще такой вопрос: если exec заменить на show, то появляется пустой messagebox и висит, почему это происходит?
0
Кудаив
412 / 411 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
06.10.2016, 12:20 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <QApplication>
#include <QMessageBox>
#include <QTimer>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMessageBox m;
    m.setText("Hi");
    QTimer::singleShot(5000, &m, SLOT(close()));
    m.exec();
 
    return a.exec();
}
все прекрасно работает

Добавлено через 1 минуту
Артем2289, можешь показать, что у тебя там ниже (после 10 строчки) по коду? show тоже должен отработать корректно.
1
Артем2289
0 / 0 / 0
Регистрация: 20.08.2015
Сообщений: 24
Завершенные тесты: 1
06.10.2016, 12:24  [ТС] 8
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <Windows.h>
#include <QtWidgets\qmessagebox.h>
#include <QtWidgets\qapplication.h>
#include <qstring.h>
#include <iostream>
#include <string>
#include <process.h>
#include <qdialog.h>
#include <qthread.h>
#include <QCloseevent>
#include <qtimer.h>
 
// глобальные переменные
WCHAR t[] = L"Программа Сергея Павловича";
int an;                                                   //временная
SYSTEMTIME Systime;
ULONGLONG timer = 36000000;
bool messtat = FALSE;                                     //флаг закрвтия окна
 
 
 
 
//основная программа
int main(int argc, char *argv[])
{
    QApplication art(argc, argv);                //создаем приложение qt
    setlocale(LC_ALL, "russian");              //русский язык
    QMessageBox Text;
    QString a;
    a = a.fromWCharArray(t, -1);
    Text.setText(a);                            //записываем строку в messagebox
    QTimer::singleShot(10000, &Text, SLOT(close()));
    Text.exec();
    //запуск цикла через 1 минуту проверки 
    while(1)
    {
        GetLocalTime(&Systime);                      //записывам локальное время в процедуру
        
        //если время == 11 или 16
      if ((Systime.wHour == 9) || (Systime.wHour == 16)) {
          if (timer >= 3600000) {                                                           //если прошло больше часа
                                                                            // thread.start();                                                                   //запуск нового потока
                                                                        
          }
      }
      // если иное время
      Sleep(6000);                                                                       //интервал проверки времени 1 минута
      timer += 60500;                                                                   //увеличиваем таймер на время sleep
 
    }
 
    std::cin >> an;                                                                          //временно
 
    return 0;
}
Добавлено через 1 минуту
дальше пока бред, остановился на этой проблеме.. задача программы такова, чтобы выводить сообщение на экран в определенное время и закрываться через некоторое время, если его не закрыли
0
Кудаив
412 / 411 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
06.10.2016, 12:27 9
Артем2289, понятно. Подход не верный, ключевой момент в приложении построенном с использованием Qt - запуск цикла обработки событий. QApplication::exec, QDialog::exec также запускает eventLoop, и по этому диалог отображается корректно, при вызове show инициируется только показ диалога.

Вот эту порнуху - нужно вынести в другой поток
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while(1)
    {
        GetLocalTime(&Systime);                      //записывам локальное время в процедуру
        
        //если время == 11 или 16
      if ((Systime.wHour == 9) || (Systime.wHour == 16)) {
          if (timer >= 3600000) {                                                           //если прошло больше часа
                                                                            // thread.start();                                                                   //запуск нового потока
                                                                        
          }
      }
      // если иное время
      Sleep(6000);                                                                       //интервал проверки времени 1 минута
      timer += 60500;                                                                   //увеличиваем таймер на время sleep
 
    }
в Qt основной поток усыплять нельзя
0
Артем2289
0 / 0 / 0
Регистрация: 20.08.2015
Сообщений: 24
Завершенные тесты: 1
06.10.2016, 12:43  [ТС] 10
прогу пишу в msvc 2015 + qt 5.7.0 x64 , сборка динамическая

Добавлено через 3 минуты
извините, всё работает, нужно поставить Release.
А почему в Debug не работает не знаете?
И такой вопрос, если окно закроет пользователь раньше, чем это сделает таймер, не выйдет ли ошибки? И если я вдруг помещу создания окна в свой класс, при удалении объекта класса, удалятся ли данные об окне, если да, то насколько это корректно?

Добавлено через 5 минут
Вот эту порнуху - нужно вынести в другой поток


в Qt основной поток усыплять нельзя
получается return всегда должен запускать цикл обработки событий qapplication? можно ли использовать стандартное создание потоков winapi? и в каком порядке запускать? сначала qapp а потом qmessagebox или наоборот?

Добавлено через 6 минут
И тогда получается, что если мой дополнительный поток, в котором решается когда запускать окно, должен же будет как то знать о состоянии окна или отпрвлаять команду основному потоку на открытие окна например, как же это реализовывать? надо будет передавать данные в поток? и вообще можно ли вызвать то же close из не основного потока?
0
Кудаив
412 / 411 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
06.10.2016, 12:57 11
Артем2289, можешь полное задание выложить - я мог бы показать, что да как
0
Артем2289
0 / 0 / 0
Регистрация: 20.08.2015
Сообщений: 24
Завершенные тесты: 1
06.10.2016, 13:25  [ТС] 12
суть задания простая, выводить окно 2 раза в день в определенное время, как напоминание... и всё
0
Maxim Prishchepa
Эксперт С++
1927 / 1039 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
06.10.2016, 16:06 13
если окно должно быть модельным, то сделайте свой класс на базе QMessageBox или QDialog и в своем классе запустите таймер ну и вызывайте окно через exec()... если же устраивает вариант с не модальным окном, то сделайте QMessageBox, создайте таймер, соедините их как-то так: connect(timer, SIGNLA(timeout()), messageBox, SLOT(accept())); и вызывайте через messageBox.show();
0
Артем2289
0 / 0 / 0
Регистрация: 20.08.2015
Сообщений: 24
Завершенные тесты: 1
06.10.2016, 16:31  [ТС] 14
мне нужен не модальный вариант. Хорошее предложение, скажите а будет ли работать так: создать свой класс mesbox, запустить окно, потом оно закроется через время, как я делал в описанном выше коде, переопределить свой Qcloseevent который бы по событию закрывал окно, выполнял нужную мне функцию и через какое то время по расписанию снова запускал окно?

если да, то такой вопрос: как правильно закрыть mesbox, чтобы потом снова можно было его запустить? или объект нужно будет объявить заново? скорее, как открыть закрытый mesbox?

Добавлено через 9 минут
Вообще конечно это не правильно, подскажите пожалуйста, как правильно передать команду show или hide объекту находящемуся в главном потоке из второго потока? Слышал, что нужен коннект и QEvent, как их использовать?
0
Maxim Prishchepa
Эксперт С++
1927 / 1039 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
06.10.2016, 17:11 15
эм... а вы уверенны, что вам поток нужен?
по поводу вышеописанного, я не уверен что это правельное решение, объектно ориентированные суицид, а потом еще и создание самого себя аки феникс - вряд-ли такие кони взлетят... у вас есть класс, в котором должен жить ваш попап, собственно сделайте в этом классе объект попапа, сделайте коннекты сигналов и слотов (как между вашим классом и попаппом, так и на оборот (я так понимаю, нужно понимать, когда попапчик закрылся, соответственно объект класса попап бросит сигнал и у себя в классе, который содержит этот попапчик выполните все необходимые действия и заодно заведете таймер на пересоздание/повторый показ (нужное подчеркнуть) попапа.

по поводу межпотокового взаимодействия, то пользуйте сигналы и слоты.
0
Артем2289
0 / 0 / 0
Регистрация: 20.08.2015
Сообщений: 24
Завершенные тесты: 1
07.10.2016, 09:14  [ТС] 16
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <Windows.h>
#include <QtWidgets\qmessagebox.h>
#include <QtWidgets\qapplication.h>
#include <qstring.h>
#include <iostream>
#include <string>
#include <qtimer.h>
#include <process.h>
#include <qthread.h>
#include <qobject.h>
#include <qmetaobject.h>
 
 
// глобальные переменные
WCHAR t[] = L"jjjjjj";
int an;                                                   //временная
SYSTEMTIME Systime;
ULONGLONG timer = 36000000;
bool messtat = FALSE;                                     //флаг закрвтия окна
 
class Work : public QThread
{
    Q_OBJECT
public:
        void run();
signals:
    void mysign();
};
 
void Work::run() {
    Sleep(10000);
    emit mysign();
    return;
}
 
//основная программа
int main(int argc, char *argv[])
{
    QApplication art(argc, argv);                //создаем приложение qt
    setlocale(LC_ALL, "russian");              //русский язык
    QMessageBox Text;
    QString a;
    a = a.fromWCharArray(t, -1);
    Text.setText(a);                            //записываем строку в messagebox
    //QTimer::singleShot(10000, &Text, SLOT(close()));
    Work thread;
    QObject::connect(&thread, SIGNAL(thread.mysign()), &Text, SLOT(Text.close()), Qt::QueuedConnection );
    thread.start();
 
    Text.show();
 
    return art.exec();
}
0
Артем2289
0 / 0 / 0
Регистрация: 20.08.2015
Сообщений: 24
Завершенные тесты: 1
07.10.2016, 09:19  [ТС] 17
написал вот такой код, хотел использовать сигнал из созданного потока, выдает следующие ошибки при компиляции...
0
Миниатюры
Закрыть Qmessagebox через некоторое время  
ValeryS
Модератор
7719 / 5731 / 742
Регистрация: 14.02.2011
Сообщений: 19,618
Завершенные тесты: 1
07.10.2016, 09:38 18
Артем2289, в Qt есть специальное окно заставки, реализованное классом QSplashScreen
оно не подойдет?
0
Артем2289
0 / 0 / 0
Регистрация: 20.08.2015
Сообщений: 24
Завершенные тесты: 1
07.10.2016, 10:01  [ТС] 19
Понимаете, дело в том, что есть много вариантов, как реализовать само окно или сообщение, у меня проблема в том, чтобы разделить цикл обработки событий от моих вычислений. у меня никак не получается отправить из потока сигнал слоту на закрытия окна и проблема в том, что я вообще не понимаю почему. Вот тут http://doc.qt.io/qt-5/qthread.html есть пример, его я делаю по аналогии у себя и он ни фига не раюотает
0
ValeryS
Модератор
7719 / 5731 / 742
Регистрация: 14.02.2011
Сообщений: 19,618
Завершенные тесты: 1
07.10.2016, 11:23 20
Цитата Сообщение от Артем2289 Посмотреть сообщение
у меня никак не получается отправить из потока сигнал слоту на закрытия окна
так там и есть метод finish() который и закрывает окно заставку
принцип примерно такой
C++ (Qt)
1
2
3
4
5
6
7
8
//создаешь окно заставку
QSplashScreen splash(......);
// делаешь видимым
splash.show();
// какие то свои действия 
...................................
// закрываешь окно заставку
splash.finish(/*здесь указатель на главное окно */);
Добавлено через 26 минут
вот примерчик
http://qt-doc.ru/okno-qsplashscreen.html
1
07.10.2016, 11:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2016, 11:23

Пропадает интернет через некоторое время
Поставил сегодня Windows 7, поставил необходимые драйвера, и спустя несколько минут пишет, что Без...

Вывести сообщение через некоторое время
Написал функцию, которая должна выводить сообщение через 10 секунд. Вызывается здесь &lt;body...

Пропадает интернет через некоторое время
Всем привет! Нужен совет, в одном из офисов есть компьютер, к с маршрутизатора подключен кабель...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru