qobject_cast()对QObject类执行动态强制转换。qobject_cast()函数的行为类似于标准c++ dynamic_cast(),其优点是它不需要RTTI支持,并且可以跨动态库边界工作。它试图将其实参强制转换为尖括号中指定的指针类型,如果对象的类型正确(在运行时确定),则返回一个非零指针,如果对象的类型不兼容则返回0。
qobject_cast 函数,使用语法如下
DestType* qobject_cast<DestType*>(QObject *p);
该函数类似于 C++中的dynamic_cast,但执行速度比dynamic_cast 更快,且不需要
C++的RTTI 的支持,但qobject_cast 仅适用于QObject 及其派生类。
主要作用是把源类型QObject 转换为尖括号中的目标类型DesType(或者子类型),并
返回指向目标类型的指针,若转换失败,则返回0。或者说源类型QObject 属于目标
类型DestType(或其子类型),则返回指向目标类型的指针,否则返回0。
使用 qobject_cast 的条件:目标类型DestType 必须继承(直接或间接)自QObject,并
使用Q_OBJECT 宏。
在使用时有两个限制:
1# T类型必须继承自QObject。
2# 在声明时必须有Q_OBJECT宏。
适用于多个对象连接到同一个槽函数。可以简化信号槽的编写。
代码如下:
#include "QtLanguage.h"
#include "ui_QtLanguage.h"
#include <QTranslator>
#include <QRadioButton>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
ui->radioButton->setChecked(true);
connect(ui->radioButton,SIGNAL(toggled(bool)),this,SLOT(changeLanguage()));
connect(ui->radioButton_2,SIGNAL(toggled(bool)),this,SLOT(changeLanguage()));
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::changeLanguage()
{
QTranslator translator;
QRadioButton* radio = qobject_cast<QRadioButton*>(sender());
if(radio == ui->radioButton)
{
translator.load(":/en_US.qm");
qApp->installTranslator(&translator);
ui->retranslateUi(this);
}
else if(radio == ui->radioButton_2)
{
translator.load(":/zh_CN.qm");
qApp->installTranslator(&translator);
ui->retranslateUi(this);
}
}