当前位置: 首页 > 面试题库 >

PyQt GUI操作顺序

陈斌蔚
2023-03-14
问题内容

我有以下问题:

在PyQt制作的GUI中按下按钮时,我必须执行以下两项操作:

  1. 立即更新QTextBrowser
  2. 运行将等待一段时间并在之后启用某些按钮的方法。

我得到的是在等待一段时间后,同时完成1和2。

部分代码是:

    #in the signals definition...
    signalUpdateProgressDialog = QtCore.pyqtSignal(str) # signal definition

    #in the connections definition...
    self.btnStopOpt.clicked.connect(self.clickStop1)
    self.btnStopOpt.clicked.connect(self.clickStop)

def updateProgressDialog(self, dialog):
    self.ProgressDialog.setHtml(dialog)

def clickStop1(self):
    # notify
    self.signalUpdateProgressDialog.emit('Message')

def clickStop(self):

    # shut down thread...

    print "Thread Stopped"

    time.sleep(5)
    # enable run button
    self.btnRun.setEnabled(True)

我在一个clickStop方法中尝试了所有方法,尝试了是否为updateProgress发出信号。始终,仅在等待时间之后刷新GUI。

不过,我之前遇到过这个问题,我想我不了解它如何与GUI一起工作。通常,如何获得所需的行为:执行代码行时会更新GUI?


问题答案:

在控制权返回到Qt事件循环之前,不会更新/绘制GUI。事件循环在主线程中运行,并处理与GUI的交互并协调信号/插槽系统。

在类似的插槽中调用Qt函数时clickStop1(),Qt调用会运行,但不会立即重绘GUI。在这种情况下,控制clickStop()只有在完成运行(即clicked处理完信号的所有插槽)后才返回事件循环。

代码的主要问题是您time.sleep(5)在主线程中有一个,这会阻止用户进行GUI交互以及重绘。您应将插槽的执行时间保持较短,以维护响应式GUI。

clicked()因此,我建议您进行修改,以使其QTimer在指定的超时后触发单发。QTimers不会阻塞主线程,因此将保持响应性。但是,请注意,与此同时,用户可能会与GUI交互!在等待QTimer执行过程中,请确保它们不会通过用户交互来破坏程序的状态。



 类似资料:
  • 2.8 操作顺序 当表达式中出现了多个运算符的时候,计算顺序取决于优先级规则。一个完整的优先级说明是十分复杂的,出于让您尽快入门的目的,先列出以下几点: 乘除法运算优先于加减法运算。因此2*3-1得到5,而不是4。2/3-1得到-1,而不是1(记住在整型除法中2/3结果是0)。 如果运算符有相同的优先级,它们会按照从左往右的顺序计算。因此表达式minute*100/60中,乘法运算最先进行,得到5

  • 本文向大家介绍JavaScript setTimeout,操作顺序,clearTimeout,包括了JavaScript setTimeout,操作顺序,clearTimeout的使用技巧和注意事项,需要的朋友参考一下 示例 setTimeout 等待指定的毫秒数后执行功能。 用于延迟执行功能。 语法: setTimeout(function, milliseconds)或window.setTi

  • reverse 返回一个与指定list相反顺序的list。 val unsortedList = listOf(3, 2, 7, 5) assertEquals(listOf(5, 7, 2, 3), unsortedList.reverse()) sort 返回一个自然排序后的list。 assertEquals(listOf(2, 3, 5, 7), unsortedList.sort())

  • 主要内容:顺序栈元素"入栈",顺序栈元素"出栈",总结顺序栈,即用 顺序表实现栈存储结构。通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如何使用顺序表模拟栈以及实现对栈中数据的基本操作(出栈和入栈)" 给大家做详细介绍。 如果你仔细观察顺序表(底层实现是数组)和栈结构就会发现,它们存储数据的方式高度相似,只不过栈对数据的存取过程有特殊的限制,而顺序表没有。 例如,我们先使用顺序表(a 数组)存储  ,存储

  • 主要内容:顺序表插入元素,顺序表删除元素,顺序表查找元素,顺序表更改元素我们学习了 顺序表及初始化的过程,本节学习有关顺序表的一些基本操作,以及如何使用 C 语言实现它们。 顺序表插入元素 向已有顺序表中插入数据元素,根据插入位置的不同,可分为以下 3 种情况: 插入到顺序表的表头; 在表的中间位置插入元素; 尾随顺序表中已有元素,作为顺序表中的最后一个元素; 虽然数据元素插入顺序表中的位置有所不同,但是都使用的是同一种方式去解决,即:通过遍历,找到数据元素要插入的位

  • 因为在过滤2之后,我们还得再找到一个元素来分层极限(2),操作,那么为什么输出不像我解释的那样呢?