如何在QT Creator上将QWidget声明为继承类的对象

How to declare a QWidget as object of an inherited class on QT Creator?

本文关键字:继承 对象 声明 QWidget QT Creator 上将      更新时间:2023-10-16

我有一个从QComboBox继承的MyComboBox类,以便覆盖方法focusOutEvent:

  1. mymbobox.h
class MyComboBox : public QComboBox
{
public:
MyComboBox();
protected:
void focusOutEvent(QFocusEvent * e) override;
};
li>mymbobox.cpp
#include "mycombobox.h"
MyComboBox::MyComboBox()
{

}
void MyComboBox::focusOutEvent(QFocusEvent * e)
{
// I will code here
qDebug()<<"Object has lost focus";

MyComboBox::focusOutEvent(e);
}

但我不知道如何将comboBox声明为MyComboBox类的对象,并且在MainWindow构造函数上使用以下内容在MyComboBox和QComboBox之间具有不兼容的类型:

MyComboBox* oMyComboBox;
oMyComboBox = ui->comboBox;

UI上的实例必须具有MyComboBox类型。这取决于对象创建过程中的类型。例如,如果你做了这样的事情:

QComboBox* comboBox; // This was declared on UI
ui->comboBox = new MyComboBox();

因此您可以将此实例用作带有qobject_cast:的MyComboBox

QComboBox *oMyComboBox = qobject_cast<MyComboBox *>(ui->comboBox);

不能将基类的实例分配给具有继承者类型的变量。所有被覆盖的虚拟成员会发生什么?因此,您的操作方式不符合OOP原则。也许,您可以始终将指针强制转换为其继承者类,但在访问类成员时会出现运行时错误,除非您要强制转换的指针是作为继承者的实例创建的。

您必须手动创建类的实例,正如alexb建议的那样:ui->comboBox = new MyComboBox;。你不需要使用任何铸造。focusOutEvent((是一个虚拟方法,将在MyComboBox的任何实例中调用,即使变量来自QComboBox。多态性!

坏消息是:

  1. 在实例化MyComboBox之前,首先需要delete ui->comboBox,否则放置在设计器中的组合框将在表单中保留为子组合框
  2. 实例化你的CCD_ 6并将其分配给CCD_;原始的";combobox。并且将不具有信号->插槽连接。你需要自己做