为什么QDialog在作业完成之前不显示任何小部件



我是pyqt5的新手,我试图打开对话框并将一些文本推入该对话框

我的对话框包含一个纯文本、进度条和按钮

当我运行代码时,它会弹出对话框,但没有显示任何内容,在代码执行完成后,它会显示所有的小部件并带有文本

但我需要打开对话框,我想要更新进度条

我的代码

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QDialog,QPlainTextEdit,QScrollArea,QProgressBar,QPushButton)
import sys
import time
class PrograssDialog():
def ShowDialog(self,Dialogs):
try:
self.Pd=Dialogs
self.Pd.setWindowTitle("Script Excution... ")
self.Pd.resize(500,500)        
self.ScrArea=QScrollArea(self.Pd)
self.ScrArea.move(0,0)
self.ScrArea.resize(500,300)
self.TextArea=QPlainTextEdit(self.Pd)
self.TextArea.move(0,0)
self.TextArea.resize(500,300)
self.TextArea.insertPlainText(str("Start : %s" % time.ctime())+"n")
self.Prograssbar=QProgressBar(self.Pd)
self.Prograssbar.setGeometry(QtCore.QRect(0, 350, 450, 23))
self.Prograssbar.setMaximum(100) 
self.Cancelbutton=QPushButton("Cancel",self.Pd)
self.Cancelbutton.setGeometry(QtCore.QRect(360, 400, 93, 28))
self.Cancelbutton.clicked.connect(self.StopExcution)   
self.Pd.show()
except Exception as msg:
import sys
tb = sys.exc_info()[2]
print("Error_analysis " + str(msg)+ str(tb.tb_lineno)) 
def AddMessage(self,Message):
self.TextArea.insertPlainText(str(Message)+"n")
# print("message added")
def SetPercentage(self,Number):
self.Prograssbar.setValue(Number)
# print("percent added")
def StopExcution(self):
sys.exit()       
app = QApplication(sys.argv)
ui=PrograssDialog()
ui.ShowDialog(QDialog())
for i in range(100):
ui.AddMessage("Hello")
ui.SetPercentage(i)
time.sleep(0.5)
sys.exit(app.exec_())  

您的代码存在各种问题,我将尝试解决所有这些问题。

  1. 您面临的问题的主要原因是no阻塞函数(如time.sleep(应该发生在主Qt线程中(该线程显示GUI元素并允许与它们交互(;阻止功能会阻止UI正确绘制和刷新其内容,如果你想在特定的时间间隔进行操作,你必须使用QTimer;

  2. 对于这种情况,您不应该使用基本的python对象子类,尤其是因为您只使用了一个对话框;您应该改为从QDialog派生子类并实现

  3. 致";退出";您的程序不应该使用sys.exit(您已经在使用它(,而是使用QApplication.quit();此外,由于一开始已经导入了sys,因此无需在异常中再次导入;

  4. 函数名和变量名不应大写;虽然你可以为自己的代码使用任何你想要的大小写风格,但总是使用小写字母缩写是常见的(也是强烈建议的(做法,而且这也是你在与他人共享代码时应该遵守的惯例,尤其是在问答中;像StackOverflow这样的网站;阅读更多关于Python代码的官方风格指南;

  5. 始终避免儿童小工具的固定几何图形:其他人在他们的电脑上看到的可能与你在你的电脑上所看到的非常不同,你可能会得到一个不可用的界面;取而代之的是使用布局管理器,这样小部件就可以在需要时自行调整大小;

  6. 您添加了一个滚动区域,但从未使用过;由于你在文本区域使用相同的几何图形,我相信你认为你在使用它,但没有必要,因为文本区域已经滚动区域;

以下是代码的外观,以实现您想要的:

import time
from PyQt5 import QtCore, QtWidgets
class ProgressDialog(QtWidgets.QDialog):
def __init__(self, parent=None):
super().__init__(parent)
layout = QtWidgets.QVBoxLayout(self)
self.textArea = QtWidgets.QPlainTextEdit()
layout.addWidget(self.textArea)
self.textArea.insertPlainText(str("Start : %s" % time.ctime())+"n")
self.textArea.setReadOnly(True)
self.progressBar = QtWidgets.QProgressBar()
layout.addWidget(self.progressBar)
self.cancelButton = QtWidgets.QPushButton('Cancel')
layout.addWidget(self.cancelButton)
self.cancelButton.clicked.connect(QtWidgets.QApplication.quit)
self.countTimer = QtCore.QTimer()
self.countTimer.timeout.connect(self.timeout)
def startCounter(self, maximum, sleepSeconds):
self.progressBar.reset()
self.progressBar.setMaximum(maximum)
# QTimer interval is in milliseconds
self.countTimer.setInterval(sleepSeconds * 1000)
self.countTimer.start()
def timeout(self):
if self.progressBar.value() == self.progressBar.maximum():
self.countTimer.stop()
return
self.setPercentage(self.progressBar.value() + 1)
self.addMessage('Hello')
def setPercentage(self, value):
self.progressBar.setValue(value)
def addMessage(self, message):
self.textArea.insertPlainText(str(message) + 'n')

if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
dialog = ProgressDialog()
dialog.show()
dialog.startCounter(100, .5)
sys.exit(app.exec_())

最新更新