首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QT QWidget初始化中的信号和事件处理完之后运行代码?

如何在QT QWidget初始化中的信号和事件处理完之后运行代码?
EN

Stack Overflow用户
提问于 2020-06-11 21:59:29
回答 1查看 110关注 0票数 0
代码语言:javascript
复制
import sys
from PyQt5.Qt import *

app = QApplication([])


class MyDialog(QDialog):
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout(self)
        self.list_widget = QListWidget()
        layout.addWidget(self.list_widget)
        self.list_widget.currentRowChanged.connect(self.on_cur_row_changed)
        self.list_widget.addItems(['apple', 'orange'])

        # code block A # start #
        self.clear_qt_currentRow()
        # code block A # end   #

        print('End of MyDialog.__init__')

    def on_cur_row_changed(self, row):
        print('Current row changed to: ', row)

    def clear_qt_currentRow(self):
        print('Clear Qt currentRow')
        self.list_widget.selectionModel().clear()


dialog = MyDialog()
dialog.show()
sys.exit(app.exec())

与上面的代码一样,我不希望QT将列表小部件的currentRow属性设置为0(第一行)。在处理QT 启动中的信号和事件之后(在本例中,将currentRow属性设置为None)之后,在clear_qt_currentRow()中运行代码,但在代码块A中(在QT更改currentRow之前)运行self.clear_qt_currentRow()。结果表明:

代码语言:javascript
复制
Clear Qt currentRow
End of MyDialog.__init__
Current row changed to:  0

然后,我尝试了下面两个代码块A的替代方案,但仍然没有让self.clear_qt_currentRow()足够晚地运行。

代码语言:javascript
复制
# alternative 1
app.processEvents()
self.clear_qt_currentRow()

# result:
# Clear Qt currentRow
# End of MyDialog.__init__
# Current row changed to:  0
代码语言:javascript
复制
# alternative 2
QTimer.singleShot(0, self.clear_qt_currentRow)

# result:
# End of MyDialog.__init__
# Clear Qt currentRow
# Current row changed to:  0

我知道QTimer.singleShot(10000,self.clear_qt_currentRow)能成功。但这不可能是一个“真正的”解决方案,因为用户可能有不同规格的电脑。

有什么建议吗?

编辑:添加我想要做的粗体文本。

编辑:在@zariii9003的帮助下,我更改为下面的代码,它完成类内的工作。

代码语言:javascript
复制
import sys
from PyQt5.Qt import *

app = QApplication([])


class MyDialog(QDialog):
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout(self)
        self.list_widget = QListWidget()
        layout.addWidget(self.list_widget)
        self.list_widget.currentRowChanged.connect(self.on_cur_row_changed)
        self.list_widget.addItems(['apple', 'orange'])
        # code block A # start #
        QTimer.singleShot(0, self.clear_qt_currentRow)
        # code block A # end   #
        print('End of MyDialog.__init__')

    def on_cur_row_changed(self, row):
        print('Current row changed to: ', row)

    def clear_qt_currentRow(self):
        print('Process events')
        # add here
        app.processEvents()
        print('Clear Qt currentRow')
        self.list_widget.selectionModel().clear()


dialog = MyDialog()
dialog.show()
sys.exit(app.exec())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-13 20:41:20

您可以看看Spyder,一种用Qt实现的IDE:

如果你看上去像这里

代码语言:javascript
复制
    # Main window
    main = MainWindow(options)

    main.show()
    main.post_visible_setup()

他们首先初始化MainWindow,然后调用show(),然后执行post_visible_setup()

就你的情况而言,这是:

代码语言:javascript
复制
dialog = MyDialog()
dialog.show()
app.processEvents()
dialog.clear_qt_currentRow()
sys.exit(app.exec())

结果:

代码语言:javascript
复制
End of MyDialog.__init__
Current row changed to:  0
Clear Qt currentRow
Current row changed to:  -1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62334262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档