Найти - Пользователи
Полная версия: Диалоговые окна pyqt5
Начало » GUI » Диалоговые окна pyqt5
1
likesoft
В общем пытаюсь написать небольшую программку, суть ее такова:
Запускается главное окно программы, но не отображается, так как мне оно нужно только как родительский элемент.
Создается поток в котором происходят вычисления, и при получении определенного результата из потока генерируется сигнал в основной поток, в основном потоке в это время вызывается метод обработчик сигнала и показывает диалоговое окно с определенным текстом.

Вот код:

 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. Если появляется несколько диалоговых окон, то последнее появившееся перекрывает все предыдущие, и нет возможности ни сфокусироваться на них, ни закрыть их. Закрыть можно лишь закрыв все окна последовательно, а мне нужно сделать чтобы я мог закрыть любое диалоговое окно(если их несколько открыто в данный момент), то есть чтобы они не были связаны друг с другом.

Подскажите пожалуйста решение, а то уже второй день голову ломаю
doza_and
likesoft
но не отображается
Вы прислали неполный код, посему непонятно что вы делаете. Обычная практика сделать окно поменьше или запускать свернутым. Главное окно все равно нужно чтобы закрывать программу досрочно.
likesoft
то есть чтобы они не были связаны друг с другом.
Такая сущность уважаемый называется обычное окно. Собственно именно этим обычные окна от диалогов и отличаются.
Rodegast
Код полный, но он повергает в уныние… Вот я его нормально переписал, дальше разбирайся сам:
 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_())
likesoft
doza_and
Вы прислали неполный код, посему непонятно что вы делаете
Код полный, просто написал его на скорую руку, для примера!
Запустите его, дождитесь появления нескольких диалоговых окон, возможно тогда вам станет понятнее
likesoft
Rodegast
Код полный, но он повергает в уныние… Вот я его нормально переписал, дальше разбирайся сам:
То что повергает в уныние не спорю
Буду исправляться)))

Спасибо большое, это именно то что мне нужно
Значит нужно было просто для отображения диалоговых окон создать отдельный класс, и вызвать метод setQuitOnLastWindowClosed(False) обьекта QApplication()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB