QObject 클래스 외부에서 메시지 상자를 표시하고 결과를 얻으려고합니다. 나는이 같은 대화 상자가 생성 할 수있을 것 :QObject 외부에서 QMessageBox 결과 표시 및 가져 오기
#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();
}
:
#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의 결과를 얻기를,이 같은 결과를 채우기 위해 간단하게 할 객체를 전달하는 작동하는 것 같다
그게 합리적으로 보입니까? 그것을 할 수있는 더 좋은 방법이 있습니까?
그래서 다중 스레드를 사용하고 있습니까? 슬롯에 msgbox를 표시하는 것 외에는 아무것도하지 않고 MyClass에 QObject 파생 클래스를 만들거나 다른 스레드의 객체를 위젯에 연결하고 거기에 메시지 상자를 표시 할 수 있습니다. –
아, 맞아, 나는 그것을 QObject 클래스에 포함시키지 않았다고 생각했지만 분명히 그 클래스가 같은 스레드에 있지 않기 때문에 그것이 옳다. 나는 아직도 여기에 있기 때문에 신호와 슬롯을 연결하는 방법을 모른다. Form :: MyClass :: MyFunction() { ... 기능하는 중 ... ... 오류가 발생합니다. .. ProduceMessageBox() } MyClass는 QObject가 아니기 때문에 신호를 낼 수 없으므로 Form의 함수를 호출하려면 어떻게해야합니까? –