C ++ Qt派生类

时间:2014-07-14 02:04:05

标签: c++ qt oop

我正在尝试学习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' MainWindow'一个QObject?
  2. 传递'这个'来自MainWindow类的QAction,而不是传递' main_window'这是(据我所知)还有一个指向MyMenu类中实例的指针?
  3. 我为这么长时间的问题道歉,但是如果你们中的任何人已经把它告诉了我,我会很高兴看到我在这里缺少什么。这里的最终目标是创建一个QMenu派生类(MyMenu here),并将其添加到单独类中存在的QMainWindow派生类(此处为MainWindow)。谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

  

如果MainWindow类继承自QMainWindow,那么不会使MainWindow' 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类的QAction,而不是传递' main_window'哪一个   是(据我所知)还有一个指向内部实例的指针   MyMenu课程?

this是指向自定义MyMenu类的指针,其中也是 QMenuBarmain_window是指向自定义MainMenu类的指针,其中也是 a QMainMenu。所以,内存中有两个不同的对象。 QAction构造函数的第二个参数采用指向父窗口小部件的指针。父窗口小部件负责管理其子窗口的内存。由于传递QObjectthis传递main_menu是合理的。


此外,您应该将父级传递给QMenu构造函数。

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

这种方式MyMenu在删除MainWindow时被正确删除。

通常的Qt范例是:

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

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