我正在尝试学习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作为父级。所有这一切,有一些事情对我来说没有意义:
我为这么长时间的问题道歉,但是如果你们中的任何人已经把它告诉了我,我会很高兴看到我在这里缺少什么。这里的最终目标是创建一个QMenu派生类(MyMenu here),并将其添加到单独类中存在的QMainWindow派生类(此处为MainWindow)。谢谢你的时间。
答案 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
类的指针,其中也是 QMenuBar
。 main_window
是指向自定义MainMenu
类的指针,其中也是 a QMainMenu
。所以,内存中有两个不同的对象。 QAction
构造函数的第二个参数采用指向父窗口小部件的指针。父窗口小部件负责管理其子窗口的内存。由于传递QObject
或this
传递main_menu
是合理的。
此外,您应该将父级传递给QMenu
构造函数。
MyMenu::MyMenu(MainWindow *main_window) : QMenuBar(main_window)
这种方式MyMenu
在删除MainWindow
时被正确删除。
通常的Qt范例是:
MyMenu::MyMenu(<arg1>, <arg2>, ... QObject * parent) : QMenuBar(parent)
但在这种情况下,main_window
的转发就足够了。