Требуется закрывать виджет QMessageBox.warning спустя 1-2 секунды после его запуска
Мне требуется создать функцию, в которой создается QMessageBox.warning и закрывать это сообщение спустя несколько секунд.
Возможно нужно обязательно создавать дополнительный новый тип QMessageBox в котором нужно будет создавать таймер.
Если кто-то сможет помочь, буду признателен. В виджете QMessageBox.warning требуется просто выводить текст "объект обнаружен".
Ответы (2 шт):
Автор решения: Chorkov
→ Ссылка
msg = QMessageBox(QMessageBox.Warning, "title", "message text")
msg.show()
QTimer.singleShot( 3000, lambda : msg.close() )
QMessageBox - это обычный класс дилогового окна. Чтобы открыть его (и оставить открытым) нужно открывать с помощью show, а не exec, как диалоги.
Автор решения: Alexander Chernin
→ Ссылка
Небольшой полигон для показа/скрытия очереди сообщений:
import sys
import random
from PyQt5.QtWidgets import QApplication, QMessageBox
from PyQt5.QtCore import QTimer, QDateTime
# Класс сообщения
# Содержит поле сообщения и абсолютное время жизни после
# Наступления которого сообщение удаляется
class Message():
def __init__(self, message, time):
self._time = time
self.box = QMessageBox()
self.box.setText(message)
self.box.setStandardButtons(QMessageBox.NoButton)
x = random.randint(300, 600)
y = random.randint(300, 600)
self.box.move(x, y)
self.box.show()
# Абсолютное время/отсечка
def time(self):
return self._time
# Закрыть QMessageBox
def close(self):
self.box.close()
# Класс очереди сообщений
class MessageQueue():
def __init__(self):
self.q = [] # очередь сообщений в виде списка
# Таймер проверки очереди сообщений
self.timer = QTimer()
self.timer.timeout.connect(self.timeout)
self.timer.start(100)
# Добавить сообщение в очередь
def append(self, message, dt=2000):
# Создаем сообщение и сразу же его показываем
# Время отсечки/жизни = текущее время + дельта dt
self.q.append(Message(message, QDateTime.currentDateTime().toMSecsSinceEpoch() + dt))
# Проверяем очередь на наличие сообщений,
# которые надо скрыть и удалить из очереди
def timeout(self):
currentTime = QDateTime.currentDateTime().toMSecsSinceEpoch()
for m in self.q:
if m.time() <= currentTime:
m.close()
self.q.remove(m)
if __name__ == "__main__":
app = QApplication([])
mq = MessageQueue()
# Создаем 5 фиктивных сообщений в очереди
for i in range(5):
mq.append('Объект обнаружен!', i * 1000)
sys.exit(app.exec_())