C++ Qt Derived Classes

C++ Qt Derived Classes

本文关键字:Classes Derived Qt C++      更新时间:2023-10-16

我正在努力学习Qt和c++,并且在理解c++这个关键字时遇到了一些麻烦。我见过这样的例子,一个类是从QMainWindow派生出来的,然后在类成员函数中添加了一个QMenu。一个例子是本页所描述的"简单菜单"程序:

http://www.zetcode.com/gui/qt4/menusandtoolbars/

在该示例中,使用

创建退出操作。
QAction *quit = new QAction("&Quit", this);

但是,假设我还想从QMenu派生一个类,并使用它来创建我的菜单。

mymenu.h

class MainWindow;   // forward declaration
class MyMenu : QMenuBar
{
public:
    MyMenu(MainWindow *main_window);
};

mymenu.cpp

#include "mymenu.hpp"
MyMenu::MyMenu(MainWindow *main_window) : QMenuBar()
{
    QAction *quit = new QAction("&Quit", main_window);  // Notice here I replaced
                                                        // 'this' with 'main_window'
    QMenu = *file;
    file = menuBar()->addMenu("&File");
    file->addAction(quit);
    connect(quit, SIGNAL(triggered()), qApp, SLOT(quit()));
}

不幸的是,这不起作用,因为QAction需要一个QObject作为父对象。话虽如此,还是有几件事对我来说没有意义:

  1. 如果类MainWindow继承自QMainWindow,不使'MainWindow'一个QObject?
  2. 传递'this'到QAction从类MainWindow内的区别是什么,而不是传递'main_window'这是(据我所知)也是一个指针从MyMenu类内的实例?

我为这样一个冗长的问题道歉,但如果你们中的任何一个人已经和我一起完成了,我希望有任何建议,我在这里错过了什么。这里的最终目标只是创建一个QMenu的派生类(这里是MyMenu),并将其添加到存在于单独类中的QMainWindow派生类(这里是MainWindow)中。感谢您的宝贵时间。

如果类MainWindow继承自QMainWindow,不使'MainWindow'一个QObject吗?

是的,MainWindow 是一个 QMainWindow,其中是一个 QObject(您可以通过浏览API文档上的继承树看到这一点)。

您只有正向声明 MainWindow。由于编译器没有MainWindow类的定义,它只能用指向MainWindow的指针做最小的事情。为了让编译器"知道"MainWindow QMainWindow,而 QObject,您必须为MainWindow提供一个类定义。您可以使用以下命令解决编译器错误:

#include "MainWindow.h"

不需要动态强制转换

同样,在Qt领域中,要使某些东西"真正"成为QObject,你应该在对象上放置Q_OBJECT宏:

class MyMenu : QMenuBar
{
  Q_OBJECT
public:
    MyMenu(MainWindow *main_window);
};

如果你打算把这个对象用于信号/槽或其他Qt的东西,它可能会为你省去一些麻烦。

从MainWindow类中传递'this'给QAction与传递'main_window'有什么区别是(据我所知)也是一个指针的实例从内部MyMenu类?

this是指向您的自定义MyMenu类的指针,其中也是 QMenuBarmain_window是指向您的自定义MainMenu类的指针,其中也是 QMainMenu。内存中有两个不同的对象。QAction构造函数的第二个参数接受一个指向父部件的指针。父部件负责管理其子部件的内存。因为需要一个QObject,所以传递thismain_menu是合理的。


你也应该传递一个父类给QMenu构造函数。

MyMenu::MyMenu(MainWindow *main_window) : QMenuBar(main_window)

这样,当MainWindow被删除时,MyMenu也会被正确地删除。

通常的Qt范例是:

MyMenu::MyMenu(<arg1>, <arg2>, ... QObject * parent) : QMenuBar(parent)

但是在这种情况下,沿着main_window转发就足够了。