gpt4 book ai didi

qt - 从QObject外部显示并获取QMessageBox的结果

转载 作者:行者123 更新时间:2023-12-02 04:12:42 25 4
gpt4 key购买 nike

我正在尝试从QObject类的外部显示并获取结果消息框。我似乎能够生成这样的对话框:

#include <iostream>

#include <QApplication>
#include <QtConcurrentRun>
#include <QMessageBox>

class DialogHandler : public QObject
{
Q_OBJECT

signals:
void MySignal();

public:
DialogHandler()
{
connect( this, SIGNAL( MySignal() ), this, SLOT(MySlot()) );
}

void EmitSignal()
{
emit MySignal();
}

public slots:
void MySlot()
{
QMessageBox* dialog = new QMessageBox;
dialog->setText("Test Text");
dialog->exec();
int result = dialog->result();
if(result)
{
std::cout << "ok" << std::endl;
}
else
{
std::cout << "invalid" << std::endl;
}
}
};

#include "main.moc" // For CMake's automoc

void MyFunction(DialogHandler* dialogHandler)
{
dialogHandler->EmitSignal();
}

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

DialogHandler* dialogHandler = new DialogHandler;

MyFunction(dialogHandler);

return app.exec();
}

为了使结果返回MyFunction,似乎可以简单地传递一个对象来填充结果,如下所示:
#include <iostream>

#include <QApplication>
#include <QtConcurrentRun>
#include <QMessageBox>

class DialogHandler : public QObject
{
Q_OBJECT

signals:
void MySignal(int* returnValue);

public:
DialogHandler()
{
connect( this, SIGNAL( MySignal(int*) ), this, SLOT(MySlot(int*)), Qt::BlockingQueuedConnection );
}

void EmitSignal(int* returnValue)
{
emit MySignal(returnValue);
}

public slots:
void MySlot(int* returnValue)
{
std::cout << "input: " << *returnValue << std::endl;
QMessageBox* dialog = new QMessageBox;
dialog->addButton(QMessageBox::Yes);
dialog->addButton(QMessageBox::No);
dialog->setText("Test Text");
dialog->exec();
int result = dialog->result();
if(result == QMessageBox::Yes)
{
*returnValue = 1;
}
else
{
*returnValue = 0;
}
}
};

#include "main.moc" // For CMake's automoc

void MyFunction(DialogHandler* dialogHandler)
{
int returnValue = -1;
dialogHandler->EmitSignal(&returnValue);

std::cout << "returnValue: " << returnValue << std::endl;
}

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

DialogHandler* dialogHandler = new DialogHandler;

QtConcurrent::run(MyFunction, dialogHandler);

std::cout << "End" << std::endl;
return app.exec();
}

看起来合理吗?有更好的方法吗?

最佳答案

这不太可能像您拥有的那样,但是只要做一些工作就可以完成。当然,一种选择是将您的类转换为QObject,此时您可以发送信号。但是,这对于执行期间的延迟没有帮助。如果有必要,您可以在主UI线程中创建一个消息传递类,但可以从其他线程中调用该消息传递类。从其他线程调用的函数将需要锁定,制作一个信号灯,并使用该信号灯和要显示的消息向自身发送事件。然后,在customEvent(位于UI线程中)中,您将创建消息框,执行该消息框,并在清除消息框后触发信号量。

当然,如果您还需要以其他方式发送信息,则事情会变得更加复杂。然后,您将需要一个用于程序的完整子系统,而不是仅像我在这里描述的那样一个基本类。

关于qt - 从QObject外部显示并获取QMessageBox的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4269774/

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