这是我之前发布的前一个问题的后续问题.问题是当使用NOT子类化Qthread的推荐方法时,如何从GUI停止(终止|退出)QThread,而是使用QObject然后将其移动到QThread.下面是一个工作实例.我可以启动GUI和Qthread,我可以让后者更新GUI.但是,我无法阻止它.我为qthread(quit(),exit(),甚至terminate())尝试了几种方法无济于事.非常感谢.
这是完整的代码:
import time, sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class SimulRunner(QObject):
'Object managing the simulation'
stepIncreased = pyqtSignal(int, name = 'stepIncreased')
def __init__(self):
super(SimulRunner, self).__init__()
self._step = 0
self._isRunning = True
self._maxSteps = 20
def longRunning(self):
while self._step < self._maxSteps and self._isRunning == True:
self._step += 1
self.stepIncreased.emit(self._step)
time.sleep(0.1)
def stop(self):
self._isRunning = False
class SimulationUi(QDialog):
'PyQt interface'
def __init__(self):
super(SimulationUi, self).__init__()
self.goButton = QPushButton('Go')
self.stopButton = QPushButton('Stop')
self.currentStep = QSpinBox()
self.layout = QHBoxLayout()
self.layout.addWidget(self.goButton)
self.layout.addWidget(self.stopButton) …Run Code Online (Sandbox Code Playgroud) 我有一个QT表单,其中包含数百个小部件,并且可以立即将它们全部放在屏幕上(根据需要)我需要使它们非常小.使用时,表格将具有固定(不可调整大小)的大小.我可以将窗口小部件的大小调整到所需的高度/宽度,并使用适当的(小)字体大小,使其大小策略"固定"等.但是,一旦我开始将它们放入布局中,它们就会产生一些,大得多的最小值尺寸.对于小部件的高度尤其如此,但宽度有时也会受到影响.
如果我知道如何做以下三件事之一,我的问题就会解决:
更改小部件的布局默认最小大小.
强制布局不要改变窗口小部件的大小.
使用Qt设计器可以在不使用布局的情况下以网格状格式很好地对齐窗口小部件.
我广泛搜索了Qt设计师的文档和SO,但无济于事.
非常感谢帮助
我试图了解如何使用从Qthread返回到启动的Gui接口的信令.
设置:我有一个需要几乎无限期运行的进程(模拟)(或者至少在很长一段时间内运行).当它运行时,它执行各种计算,并且一些结果必须被发送回GUI,将实时适当地显示它们.我正在使用PyQt进行GUI.我最初尝试使用python的线程模块,然后在SO和其他地方阅读了几个帖子后切换到QThreads.
根据Qt博客上的这篇文章你做错了,使用QThread的首选方法是创建一个QObject,然后将其移动到Qthread.所以我在PyQt中跟随了关于QThread的onBackground线程的建议">这个问题并尝试了一个简单的测试应用程序(下面的代码):它打开了一个简单的GUI,让你启动后台进程,并且它发布了更新步骤值一个旋转盒.
但它不起作用.GUI永远不会更新.我究竟做错了什么?
import time, sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class SimulRunner(QObject):
'Object managing the simulation'
stepIncreased = pyqtSignal(int, name = 'stepIncreased')
def __init__(self):
super(SimulRunner, self).__init__()
self._step = 0
self._isRunning = True
self._maxSteps = 20
def longRunning(self):
while self._step < self._maxSteps and self._isRunning == True:
self._step += 1
self.stepIncreased.emit(self._step)
time.sleep(0.1)
def stop(self):
self._isRunning = False
class SimulationUi(QDialog):
'PyQt interface'
def __init__(self):
super(SimulationUi, self).__init__()
self.goButton = QPushButton('Go')
self.stopButton = QPushButton('Stop')
self.currentStep = QSpinBox()
self.layout …Run Code Online (Sandbox Code Playgroud) 我很清楚 char* argv[] 和 char** argv 之间的区别(例如,在这个问题中所解释的)。
但是 char** argv[] 是什么类型?指向字符指针的指针?当用于向程序传递参数时,那会是什么?
根据记录,该类型出现在我尝试与 Python 连接的 C++ 库的以下声明中:
/** Initialize the Stage library. Stage will parse the argument
array looking for parameters in the conventional way. */
void Init( int* argc, char** argv[] );
Run Code Online (Sandbox Code Playgroud) 我需要运行一系列(无限循环)无限循环,必须能够检查外部设置条件才能终止.我认为线程模块会允许这样做,但我的努力如此失败.这是我想要做的一个例子:
import threading
class Looping(object):
def __init__(self):
self.isRunning = True
def runForever(self):
while self.isRunning == True:
"do stuff here"
l = Looping()
t = threading.Thread(target = l.runForever())
t.start()
l.isRunning = False
Run Code Online (Sandbox Code Playgroud)
我原本期望t.start在一个单独的线程中运行,l的属性仍然可以访问.这不是发生的事情.我在python shell(IPython)中尝试了上面的代码片段.在实例化之后立即执行t start并且它阻止任何进一步的输入.很明显我对线程模块没有正确的看法.有关如何解决问题的任何建议?