Ich versuche, das Ergebnis anzeigen und erhalten ein Meldungsfeld von außerhalb einer QObject-Klasse. Ich scheine in der Lage sein den Dialog wie folgt zu generieren:Anzeigen und erhalten das Ergebnis einer QMessageBox von außerhalb eines 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();
}
Um das Ergebnis zurück in MyFunction zu bekommen, scheint es zu funktionieren einfach zu tun, ein Objekt übergeben, mit dem Ergebnis so füllen:
#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();
}
Scheint das vernünftig? Gibt es einen besseren Weg, es zu tun?
Sie verwenden also mehrere Threads? Sie könnten eine von QObject abgeleitete Klasse in MyClass erstellen, die nichts anderes tut, als die msgbox in einem Slot anzuzeigen, oder Sie könnten das Objekt im anderen Thread mit Ihrem Widget verbinden und dort die Messagebox anzeigen. –
Ah, richtig, ich habe angegeben, dass ich nicht in einer QObject-Klasse bin, aber Sie haben eindeutig Recht, dass dies daran liegt, dass diese Klasse nicht im selben Thread ist. Ich weiß immer noch nicht, wie man das Signal und den Steckplatz verbindet, weil ich hier bin: Formular :: MyClass :: MyFunction() { ... macht die Funktion ... ... ein Fehler passiert. .. ProduceMessageBox() } Da MyClass kein QObject ist, kann es keine Signale aussenden. Wie kann ich also eine Funktion von Form aufrufen? –