C++ Qt Derived Classes
C++ Qt Derived Classes
我正在努力学习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作为父对象。话虽如此,还是有几件事对我来说没有意义:
- 如果类MainWindow继承自QMainWindow,不使'MainWindow'一个QObject?
- 传递'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
类的指针,其中也是 QMenuBar
。main_window
是指向您的自定义MainMenu
类的指针,其中也是 QMainMenu
。内存中有两个不同的对象。QAction
构造函数的第二个参数接受一个指向父部件的指针。父部件负责管理其子部件的内存。因为需要一个QObject
,所以传递this
或main_menu
是合理的。
你也应该传递一个父类给QMenu
构造函数。
MyMenu::MyMenu(MainWindow *main_window) : QMenuBar(main_window)
这样,当MainWindow
被删除时,MyMenu
也会被正确地删除。
通常的Qt范例是:
MyMenu::MyMenu(<arg1>, <arg2>, ... QObject * parent) : QMenuBar(parent)
但是在这种情况下,沿着main_window
转发就足够了。
- 将sharet_ptr<Derived>转换为shared_ptr<Base>
- 从 std<Derived>::shared_ptr 的向量返回 std::shared_ptr<Base>
- 如何使用"derived input class"创建派生类?
- 如何从unique_ptr返回unique_ptr的引用<Derived><Base>?
- 如何将unique_ptr<derived>*转换为<base>unique_ptr*?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- Threads with Classes and std::packaged_task
- 如何从 Eigen::MatrixBase <Derived>获取存储选项
- 两个成员,在Base中默认初始化,可能在Derived中非默认初始化
- 从"<Base>std::unique_ptr"创建"ClassType<std::unique_ptr>"时出现编译错误<Derived>
- 为什么在此示例中从unique_ptr自动向上转换<derived>到unique_ptr<base>失败?
- 为什么unique_ptr<Derived>隐式投射到unique_ptr<Base>?
- 候选函数不可行:没有从 std::vector<derived> 到 std::vector <base>的已知转换
- C++ Classes/Confusion
- 在使用Qt Designer Form Classes扩展我自己的自定义小部件时防止重复的自动连接
- Classes composition
- 将static_pointer_cast添加到<Derived> std::list<shared_ptr<Base>> 会导致称为 error 的纯虚拟方法
- Derived Classes C++
- C++ derived classes
- C++ Qt Derived Classes