Qt中需要点击开始按钮循环执行process.start启动外部程序,循环执行外部程序的时候,窗口的结束按钮不能用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt中需要点击开始按钮循环执行process.start启动外部程序,循环执行外部程序的时候,窗口的结束按钮不能用相关的知识,希望对你有一定的参考价值。

参考技术A 这就是界面假死。。。你要 处理好循环事件。。要单独启循环事件。追问

能说详细一点儿吗。怎么单独启循环事件,点击开始按钮之后,启动了循环执行外部程序和让结束按钮为true,如果要单独启循环事件,是要把让结束按钮为true这个动作放在另外一个程序里吗?我试了,好像不行

追答

UI编程怎么可以死循环。。。。。你把你的死循环放线程里面吧!

Qt Designer UI (python) 到 JSON

【中文标题】Qt Designer UI (python) 到 JSON【英文标题】:Qt Designer UI (python) to JSON 【发布时间】:2017-06-10 00:46:59 【问题描述】:

我最近开始使用 qt 构建 python GUI。我有两个问题我找不到解决方案。下面的代码是我需要构建的示例。

1:检查垂直布局中单选按钮列表中的哪个单选按钮已被单击。在 GUI 中,它只从布局中所有其他可用的单选按钮中选择一个。我如何感知哪个被点击了?

2:我想将点击的值添加到 JSON 对象,但我相信这是一个简单的 if 语句 if this then that。除非情况更复杂,否则请把我推向正确的方向。

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'test.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(596, 466)
        self.verticalLayoutWidget = QtWidgets.QWidget(Dialog)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(180, 70, 61, 80))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.that = QtWidgets.QRadioButton(self.verticalLayoutWidget)
        self.that.setObjectName("that")
        self.verticalLayout.addWidget(self.that)
        self.thi = QtWidgets.QRadioButton(self.verticalLayoutWidget)
        self.thi.setObjectName("thi")
        self.verticalLayout.addWidget(self.thi)
        self.sure = QtWidgets.QRadioButton(self.verticalLayoutWidget)
        self.sure.setObjectName("sure")
        self.verticalLayout.addWidget(self.sure)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.that.setText(_translate("Dialog", "that"))
        self.thi.setText(_translate("Dialog", "this"))
        self.sure.setText(_translate("Dialog", "sure"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

有一个很好的方法可以使用 Qt Designer 解决这个问题,它允许您将按钮分组到 QButtonGroup,然后连接到它的 buttonClicked signal 以获取被点击的按钮。

您只需在 Qt Designer 中选择所有按钮(使用 Ctrl+单击),然后右键单击其中一个按钮并选择分配到按钮组 -> 新建按钮组。这将创建一个新的按钮组对象并自动将所有按钮添加到其中。

重新生成你的 gui 模块后,你可以像这样做一些事情:

ui.radioButtonGroup.buttonClicked.connect(radioButtonClicked)

def radioButtonClicked(button):
    print(button.text())

【讨论】:

这似乎是最好的选择,我可能会使用它。谢谢! 好吧,这么大的问题,当我使用它时,它会使整个 GUI 崩溃。我收到一个弹出窗口,说 python 停止工作。你以前遇到过这个问题吗?在 python 3.5.2 和 qt5 中工作 @Haq.H.您是否使用 pyuic 重新生成了 gui 模块?如果不是,问题一定出在你自己的代码中。 我做了我重新生成了新的 .py 文件,确实没有错误消息,所以我不知道在哪里看 如果您愿意,我只是发了一个包含更多详细信息的帖子看看吧***.com/questions/41925622/…【参考方案2】:

我认为你需要这样的东西(未经测试)

# Set Default
self.thi.setChecked(True)

# create a signal
QtCore.QObject.connect(self.that,
                       QtCore.SIGNAL("toggled(bool)"),
                       self.radio_clicked)

然后创建一个函数

def self.radio_clicked(self):
    print 'ive been clicked' # work from here

【讨论】:

我去看看,我得出了类似的结论,但是没有使用 QtCore.SIGNAL 它是做什么用的?

以上是关于Qt中需要点击开始按钮循环执行process.start启动外部程序,循环执行外部程序的时候,窗口的结束按钮不能用的主要内容,如果未能解决你的问题,请参考以下文章

WPF中想要让一个按钮单击事件结束后自动再单击这个按钮,也就是让单机事件连续反复执行,应该如何实现?

qt中如何实现点击一个窗口的按钮,另一个窗口开始画图? 十万火急

Qt的高手们,向你们请教: Qt界面的一个控件,比如说一个GroupBox,如何在其刚开始运行时为不可见,点击按

Qt Designer UI (python) 到 JSON

OpenCV + Qt 制作视频播放器

QT软件开发之基础控件--2.1.1 QAbstractButton类