Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相当于wxPython';在PyQt/PySide中冻结和解冻_Python_Qt_Pyqt_Wxpython_Pyside - Fatal编程技术网

相当于wxPython';在PyQt/PySide中冻结和解冻

相当于wxPython';在PyQt/PySide中冻结和解冻,python,qt,pyqt,wxpython,pyside,Python,Qt,Pyqt,Wxpython,Pyside,当我在wxPython中对一个小部件进行多次更新(比如加载表、树、取消隐藏小部件等的内容)时,我经常使用它来禁用小部件重新绘制,当我完成时,我会调用它,以便新内容一次出现。Qt中有类似的方法吗 相关问题:在Qt中,不需要这样做,因为更新事件是压缩的,在控件返回到事件循环之前不会被传递。例如,以下操作只会导致重新绘制标签一次: void test(QLabel * label) { label->setText("foo"); // update is called internal

当我在wxPython中对一个小部件进行多次更新(比如加载表、树、取消隐藏小部件等的内容)时,我经常使用它来禁用小部件重新绘制,当我完成时,我会调用它,以便新内容一次出现。Qt中有类似的方法吗


相关问题:

在Qt中,不需要这样做,因为更新事件是压缩的,在控件返回到事件循环之前不会被传递。例如,以下操作只会导致重新绘制标签一次:

void test(QLabel * label) {
  label->setText("foo");
  // update is called internally by setText, but the extra call is harmless here
  label->update(); 
  label->setText("bar");
  label->setText("baz");
}
如果确定更新中穿插着返回事件循环,则可以通过过滤更新事件来实现冻结/解冻,如下所示。下面是C++,可以随意翻译成Python:< /P>
类更新过滤器:公共QObject{
Q_对象
QSet m_延迟更新;
Q_插槽空位已删除(QObject*obj){
m_延迟更新。删除(obj);
}
Q_对象布尔事件过滤器(QObject*obj,QEvent*ev){
如果(ev->type()==QEvent::UpdateRequest){
如果(!m_deferredUpdates.contains)(obj){
m_延迟更新。插入(obj);
连接(对象、信号(已破坏(QObject*))、插槽(已破坏(QObject*));
}
返回true;
}
返回false;
}
公众:
无效解冻(QWidget*w){
if(m_delferredupdates.contains(w)){
w->update();
m_延迟更新。删除(w);
}
};
//此实例仅在第一次调用freeze时创建。
Q_全局_静态(UpdateFilter,UpdateFilter)
无效冻结(QWidget*w){w->installEventFilter(&updateFilter());}
void thaw(QWidget*w){updateFilter().thaw(w);}

我知道这是一篇老文章,但我在

有一种方法可以做到这一点:

blockSignals(bool)
用于禁止
QObject
及其子类发出信号,从而防止任何其他对象在插槽中接收信号。但这是一种
QObject
方法。如果您特别试图阻止一个对象发出信号以响应所做的更改,则可能会触发c在插槽中进行计算或其他一些昂贵的处理,那么这就是您想要的

但是,如果您的情况是重复更改会导致反复执行昂贵的绘制操作(或在小部件上生成其他昂贵的事件),那么您可以使用
updateEnabled(bool)禁用更新
。此方法的一个好处是,它递归地禁用目标小部件的子部件,防止它们也被更新。因此,在再次启用之前,层次结构中的任何内容都不会接收更新

mainWidget.setUpdatesEnabled(False)
# do a bunch of operations that would trigger expensive events
# like repaints
mainWidget.setUpdatesEnabled(True)

也许我读错了什么,你的相关问题怎么不是傻瓜?@wnnmaw我问的是
Qt
,相关问题问的是
Tkinter
。对了,谢谢,我知道我遗漏了一些东西。很抱歉很久没有研究这个问题。我举了一个例子,说明你的第一部分答案似乎不适用。你有什么建议吗“update events is compressed”(更新事件已压缩)的引用?我的情况是尝试调整窗口大小(由于取消隐藏某些元素)然后移动窗口,使其仍在屏幕上居中。但是我可以看到它轻轻摆动片刻,因此事件似乎没有被压缩。@Fenikso更新事件和调整大小事件都被压缩,但这可能不足以防止在某些情况下闪烁,尤其是在调整大小期间,当事件循环经常被W耗尽时indows本身。哦,你是说,事件是压缩的,但是OS窗口管理器在调整大小和移动方面很慢?看起来很有趣。我将在我的问题上对此进行测试。这对我遇到的原始问题没有帮助,但是在其他情况下,这可能是一个不错的选择。谢谢+1。
mainWidget.setUpdatesEnabled(False)
# do a bunch of operations that would trigger expensive events
# like repaints
mainWidget.setUpdatesEnabled(True)