3
我試圖從QObject類的外部顯示並獲得結果消息框。我似乎能夠產生這樣的對話:顯示並從QObject外部獲取QMessageBox的結果
#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();
}
這看起來合理嗎?有沒有更好的方法來做到這一點?
所以你使用多個線程?你可以在MyClass中創建一個QObject派生類,除了在一個插槽中顯示msgbox外別無所物,或者可以將另一個線程中的對象連接到你的小部件並在那裏顯示消息框。 – 2010-11-24 22:31:40
嗯,對,我把它歸因於不在QObject類中,但是你顯然是正確的,因爲這個類不在同一個線程中。我仍然不知道如何連接信號和插槽,因爲我在這裏: Form :: MyClass :: MyFunction() { ...正在執行功能... ...發生錯誤。 ProduceMessageBox() } 由於MyClass不是QObject,它不能發射信號,所以如何讓它調用Form的函數呢? – 2010-11-25 16:32:40