Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 28, 2017 23:49:12

likesoft
Зарегистрирован: 2014-02-20
Сообщения: 29
Репутация: +  1  -
Профиль   Отправить e-mail  

Диалоговые окна pyqt5

В общем пытаюсь написать небольшую программку, суть ее такова:
Запускается главное окно программы, но не отображается, так как мне оно нужно только как родительский элемент.
Создается поток в котором происходят вычисления, и при получении определенного результата из потока генерируется сигнал в основной поток, в основном потоке в это время вызывается метод обработчик сигнала и показывает диалоговое окно с определенным текстом.

Вот код:

 from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import time
import sys
class Wgt(QWidget):
    def __init__(self):
        self.app = QApplication(sys.argv)
        super().__init__()
        lp_thr = LongPollThread(self)
        lp_thr.mySignal.connect(self.MessageWindow)
        lp_thr.start()
        self.app.exec_()
    def MessageWindow(self, val)
        wgt = QDialog()
        lbl_info = QLabel("hello world! The value is " + val)
        lbl_info.setMaximumWidth(500)
        lbl_info.setWordWrap(True)
        form = QFormLayout()
        form.addRow(lbl_info)
        wgt.setLayout(form)
        wgt.setWindowTitle('Hello world')
        wgt.setBaseSize(300, 300)
        wgt.exec_()
class LongPollThread(QThread):
    mySignal = pyqtSignal([str])
    def __init__(self, par):
        super(LongPollThread, self).__init__(par)
    def run(self):
        vr = [10, 20, 40, 50, 123, 433, 231, 934, 563, 765]
        for i in range(1, 1000):
            if i in vr:
                print(i)
                self.mySignal.emit(str(i))
                time.sleep(15)

При выполнении кода есть несколько проблем:
1. Если закрыть диалоговое окно, то программа завершается полностью, а мне нужно чтобы при закрытии диалогового окна, основной цикл приложения и поток дальше работали.
2. Если появляется несколько диалоговых окон, то последнее появившееся перекрывает все предыдущие, и нет возможности ни сфокусироваться на них, ни закрыть их. Закрыть можно лишь закрыв все окна последовательно, а мне нужно сделать чтобы я мог закрыть любое диалоговое окно(если их несколько открыто в данный момент), то есть чтобы они не были связаны друг с другом.

Подскажите пожалуйста решение, а то уже второй день голову ломаю

Отредактировано likesoft (Фев. 28, 2017 23:50:48)

Офлайн

#2 Март 1, 2017 06:12:22

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Диалоговые окна pyqt5

likesoft
но не отображается
Вы прислали неполный код, посему непонятно что вы делаете. Обычная практика сделать окно поменьше или запускать свернутым. Главное окно все равно нужно чтобы закрывать программу досрочно.
likesoft
то есть чтобы они не были связаны друг с другом.
Такая сущность уважаемый называется обычное окно. Собственно именно этим обычные окна от диалогов и отличаются.



Офлайн

#3 Март 1, 2017 10:03:56

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2683
Репутация: +  182  -
Профиль   Отправить e-mail  

Диалоговые окна pyqt5

Код полный, но он повергает в уныние… Вот я его нормально переписал, дальше разбирайся сам:

 import sys
import PySide.QtGui as QtGui
import PySide.QtCore as QtCore
 
class MessageWindow(QtGui.QDialog):
	def __init__(self):
		QtGui.QDialog.__init__(self)
		self.lbl_info = QtGui.QLabel(self)
		self.lbl_info.setMaximumWidth(500)
		self.lbl_info.setWordWrap(True)
		self.form = QtGui.QFormLayout()
		self.form.addRow(self.lbl_info)
		self.setLayout(self.form)
		self.setWindowTitle('Hello world')
		self.setBaseSize(300, 300)
 
	def show(self, val):
		self.lbl_info.setText("hello world! The value is %i"%val)
		QtGui.QDialog.show(self)
 
class LongPollThread(QtCore.QThread):
	def run(self):
		vr = [10, 20, 40, 50, 123, 433, 231, 934, 563, 765]
		for i in range(1, 1000):
			if i in vr:
				print(i)
				self.emit(QtCore.SIGNAL("MySignal(PyObject)"), i)
				QtCore.QThread.msleep(15000)
 
if __name__ == "__main__":
	app = QtGui.QApplication(sys.argv)
	app.setQuitOnLastWindowClosed(False)
	win = MessageWindow()
	lp_thr = LongPollThread()
	lp_thr.connect(QtCore.SIGNAL("MySignal(PyObject)"), win.show)
	lp_thr.start()
	sys.exit(app.exec_())



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Март 1, 2017 11:38:16)

Офлайн

#4 Март 1, 2017 11:30:35

likesoft
Зарегистрирован: 2014-02-20
Сообщения: 29
Репутация: +  1  -
Профиль   Отправить e-mail  

Диалоговые окна pyqt5

doza_and
Вы прислали неполный код, посему непонятно что вы делаете
Код полный, просто написал его на скорую руку, для примера!
Запустите его, дождитесь появления нескольких диалоговых окон, возможно тогда вам станет понятнее

Офлайн

#5 Март 1, 2017 11:38:12

likesoft
Зарегистрирован: 2014-02-20
Сообщения: 29
Репутация: +  1  -
Профиль   Отправить e-mail  

Диалоговые окна pyqt5

Rodegast
Код полный, но он повергает в уныние… Вот я его нормально переписал, дальше разбирайся сам:
То что повергает в уныние не спорю
Буду исправляться)))

Спасибо большое, это именно то что мне нужно
Значит нужно было просто для отображения диалоговых окон создать отдельный класс, и вызвать метод setQuitOnLastWindowClosed(False) обьекта QApplication()

Отредактировано likesoft (Март 1, 2017 12:05:33)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version