#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QString> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); private slots: void on_pushButton_clicked(); QString getstring(bool flag = false); private: Ui::Widget *ui; bool flag ; }; #endif // WIDGET_H
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); flag = true; } Widget::~Widget() { delete ui; } QString Widget::getstring(bool flag) { QString str; if(flag) str = "hello world"; else str = "hello world one"; return str; } void Widget::on_pushButton_clicked() { QString str; flag = !flag; //元对象调用 QMetaObject::invokeMethod(this,"getstring", Qt::DirectConnection, Q_RETURN_ARG(QString,str), Q_ARG(bool,bool(flag))); ui->lineEdit->setText(str); } QMetaObject::invokeMethod的使用等同于 QString str = this->getstring(flag);但是使用元对象调用会进行安全检查,不会造成程序的异常崩溃。
更详细的介绍请参考该博主分享:Qt之QMetaObject::invokeMethod()使用简介_luoyayun361的专栏-CSDN博客