qobject_cast<>()应用

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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41882459/article/details/113843787