对于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( )函数可返回类的名称字符串。