gpt4 book ai didi

c++ - Qt 信号以一种奇怪的方式发出

转载 作者:行者123 更新时间:2023-11-30 02:16:49 25 4
gpt4 key购买 nike

我有以下按钮代码:

emit busySignal();
QString program = "cmd";
QStringList arguments;
arguments << "";
QProcess *myProcess = new QProcess(this);
myProcess->start(program, arguments);
myProcess->write("cd C:\\Qt\\5.11.2\\mingw53_32\\bin\\\n");
myProcess->waitForBytesWritten();
myProcess->write("windeployqt C:\\Users\\BRSLV\\Desktop\\qml_collect_project\n");
myProcess->waitForBytesWritten();
myProcess->waitForFinished();
myProcess->close();
emit readySignal();

和以下 qml 代码:

Model
{
id : model
onBusySignal: busy.running = true
onReadySignal: busy.running = false
}
BusyIndicator {
id: busy
running: false

}

问题是 - 由于某些原因,信号没有像我期望的那样工作:busySignal() 仅在 QProcess 完成后才影响 qml。有人可以告诉我如何解决吗?谢谢。

最佳答案

waitForXXX 方法是阻塞的,因此它们会卡住 GUI,阻止异步任务(例如信号的传输)执行,因此解决方案是使用信号来知道何时通知任务完成。

另一方面,您可以使用 setWorkingDirectory() 代替 cd 命令来减少您的代码。

main.cpp

#include <QGuiApplication>
#include <QProcess>
#include <QQmlApplicationEngine>

class ProcessManager: public QObject
{
Q_OBJECT
public:
ProcessManager(QObject *parent=nullptr):
QObject(parent)
{
connect(&m_process, QOverload<int>::of(&QProcess::finished), this, &ProcessManager::readySignal);
}
Q_INVOKABLE void start_process(){
emit busySignal();
const QString program = "cmd";
m_process.setWorkingDirectory("C:\\Qt\\5.11.2\\mingw53_32\\bin");
m_process.start(program, {"windeployqt", "C:\\Users\\BRSLV\\Desktop\\qml_collect_project"});
}
signals:
void busySignal();
void readySignal();
private:
QProcess m_process;
};

int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
qmlRegisterType<ProcessManager>("com.utils", 1, 0, "ProcessManager");
QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
#include "main.moc"

ma​​in.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.5

import com.utils 1.0

Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
ProcessManager{
id: pm
onBusySignal: busy.running = true
onReadySignal: busy.running = false
}
BusyIndicator {
id: busy
running: false
}
Button{
anchors.top: busy.bottom
text: "start process"
onClicked: pm.start_process()
}
}

关于c++ - Qt 信号以一种奇怪的方式发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54380691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com