使用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;
}
}
}
浙公网安备 33010602011771号