C++、Qt类型转换 dynamic_cast、 static_cast、const_cast、 qobject_cast

dynamic_cast,static_cast,const_cast,qobject_cast,reinterpret_cast

dynamic_cast使用

  • 下行安全
class Base
{
public:
    Base(){}
    virtual void  show(){}
};

class AChild : public Base
{
public:
    AChild()
    {

    }
};
int main()
{
	Base* base1 = new AChild();
	AChild* aChild = dynamic_cast(base1);//下行安全
	return 0;
}

static_cast

  • 类上行安全,下行不安全
    1. 同上面的例子

const_cast

  • 这个就是去常

reinterpret_cast

  • 用于转换后的不安全

qobject_cast使用

  • 在使用上有两个限制

    1. 必须继承QObject
    2. 必须在头文件中声明下Q_OBJECT宏
  • 使用场景1

    1. 在槽函数里面如果获取想获取信号的发送者的对象是谁,则可以通过sender()函数为获取
        auto cccTestBtn = new QPushButton(this);
    connect(cccTestBtn,&QPushButton::clicked,this,[this](){
        auto obj = sender(); //obj 为QObject类型,sender()返回的是QObject*类型
        //TODO:
        auto testBtn = qobject_cast(obj);
        //...
    });
    

    上面代码其实没有实际的意义,仅仅演示下sender() 跟qobject_cast使用

    2.在主窗口通过QWidget * QApplication::focusWidget()可以获得当前拥有焦点的widget,然后和你的那几个可能有焦点的widget逐一比对即可执行对应操作

     auto ptrWidget = qApp->focusWidget();
     if (btn1 == qobject_cast(ptrWidget ))
      {
              //TODO: btn1  obj handle
      }
      else if(btn2 == qobject_cast(ptrWidget ))
      { 
              //TODO: btn2 obj handle
      }
    
    

你可能感兴趣的:(Qt,qt,c++,开发语言)