QT动态映射qobject_cast()

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 
#include 
#include 
 
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( )函数可返回类的名称字符串。
QT动态映射qobject_cast()_第1张图片

实际基于C++虚函数实现

你可能感兴趣的:(QT,qt5)