Qt动态映射qobject_cast()

对于QObject及其子类可以通过qobject_cast()函数进行动态映射dynamic cast。

假设QMyWidget是QWidget的子类,并且在类定义中声明了Q_OBJECT宏,

QObject *obj = new QMyWidget();

obj实际指向QMywidget类,所以可以正确投射为QWidget

QWidget *widget = qobject_cast<QWidget *>(obj);
obj实际是QMyWdiget类,是QWidget的子类,投射是成功的。


qobject_cast并不区分Qt内建的类型和用户自定义的类型。

若要讲obj投射到QLabel则是失败的

返回的label是NULL,因为QMyWidget不是QLabel的子类

使用动态投射,使得程序在遇到不同的对象做不同的处理

QLabel *label = qobject_cast<QLabel *>(obj);'

以下为实例:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QLabel *label = new QLabel();
    QPushButton *button = new QPushButton();
    QLineEdit *lineEdit = new QLineEdit();

    showObject(label);
    showObject(button);
    showObject(lineEdit);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::showObject(QObject *obj)
{
    QWidget *widget = qobject_cast<QWidget *>(obj);
    widget->show();
    widget->setWindowTitle(QString(obj->metaObject()->className()));
}

QMetaObject::className( )函数可返回类的名称字符串。



其实这个就是C++的虚函数实现的。





猜你喜欢

转载自blog.csdn.net/baidu_20351223/article/details/80204062