使用Qt的meta-object系统,如QMetaObject::newInstance,QMetaObject::invokeMethod等创建对象

Qt创建对象有两种方式:

1、使用Qt自带的构造函数,如QWidget,QPushButton,QDialog等。

2、使用Qt的meta-object系统,如QMetaObject::newInstance,QMetaObject::invokeMethod等。

这两种方式的区别在于,第一种方式是使用Qt自带的构造函数,它可以直接创建Qt对象,但是不能实现动态创建,也不能调用它们的函数或者访问它们的成员变量。

第二种方式是使用Qt的meta-object系统,它可以实现动态创建Qt对象,可以调用它们的函数或者访问它们的成员变量。

存在限制:
1.qt版本,5.14起才支持newinstance();
2.使用invokemethod(),只能调用槽函数,被qinvokeable宏修饰的函数,普通函数无法调用

MainWindow::MainWindow(QWidget *parent)
QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
qDebug() << "Qt Version:" << QT_VERSION_STR;
    // 或者以数字形式输出版本号
    qDebug() << "Qt Version Number:" << QT_VERSION;
    //Qt Version: 5.12.12
    //Qt Version Number: 330764

// const QMetaObject * mobject=&QPushButton::staticQtMetaObject;
// QObject* button=mobject->newInstance();
//QVBoxLayout *layout = new QVBoxLayout(&window);

    // 获取QPushButton的meta-object
    const QMetaObject *metaObject = &QPushButton::staticMetaObject;
     //QObject *button = metaObject->newInstance();
    QObject *button= new QPushButton();
     //确认你的 Qt 版本支持 QMetaObject::newInstance() 方法(从 Qt 5.14 开始引入)
if(button)
{
    QPushButton* p_button=qobject_cast<QPushButton*>(button);
    connect(p_button,&QPushButton::clicked,this,[&](){
        QMessageBox::information(this,"tishi","button clicked!");
    });

    //ui->centralwidget->layout()->addWidget(p_button);
    QHBoxLayout* layout=new QHBoxLayout(this);
    layout->addWidget(p_button);
    ui->centralwidget->setLayout(layout);


    bool res=QMetaObject::invokeMethod(p_button,"setText",Qt::QueuedConnection,Q_ARG(QString, "dididi"));
    //错误
    //QMetaObject::invokeMethod 只能调用类的槽或被 Q_INVOKABLE 标记的方法。
    // 使用Q_INVOKABLE标记函数,
        Q_INVOKABLE void sayHello(const QString &name) {
            qDebug() << "Hello" << name;
        }
}

}

posted on 2025-02-24 11:37  不败剑坤  阅读(383)  评论(0)    收藏  举报

导航