将QMainWindow或Widget添加到另一个Widget - 访问成员

时间:2014-02-15 22:29:10

标签: c++ qt

让我们假设我想创建一个周围有模糊阴影的小部件,我想这样做:

  1. A类:包含一个空的布局和阴影周围的一些边距。这是透明的
  2. B类:包含我的widget或mainWindow及其所有成员,功能等。
  3. 我将B类的小部件对象objB添加到A类的对象objA中(将其添加到其布局中)。
  4. 两个表单都是在ui - 文件中创建的。 objB的功能,例如已在classB.cppclassB.h中实施。

    现在我想知道:

    通常,如果我想在构造函数之后保持objB活着,我会添加一个指向我的主类列表的指针。但现在,我是否必须保存objBobjA的指针?我现在如何访问此小部件的成员?他们现在是objA的成员吗?

    我的objB类型QMainWindow还是QWidget是否会有所不同?

1 个答案:

答案 0 :(得分:0)

Qt使用它的对象树来管理大部分内容。

http://qt-project.org/doc/qt-5/objecttrees.html

基本上,您只需将任何内容与其父级相关联,您就不需要将其作为成员变量。如果你看一下这些例子,其中有一些只有一个main.cpp,甚至没有一个单独的类来跟踪什么属于什么。

编辑:几乎任何放在对象树上的GUI元素都应该是一个指针,并在堆上用new进行初始化。如果你不那样做,那么当事情超出范围时,你可能会遇到问题。

如果您命名对象并使用QObject::findChild<T>(QString name);函数,您甚至可以在对象树上找到元素。

http://qt-project.org/doc/qt-5/qobject.html#findChild

QMainWindowQWidget之间的主要区别在于QMainWindow附带了菜单栏,工具栏,停靠栏以及为您设置的中央窗口小部件指针。

如果您不使用任何菜单栏,工具栏,停靠栏等,QMainWindowQWidget相比的功能和外观几乎完全相同。

唯一的区别是如何开始向窗口小部件的中间添加元素。使用QMainWindow,您可以将任何类型的QWidget设置为中央窗口小部件,然后从那里开始。对于QWidget,通常我会在其中设置一个布局,然后在布局中挂起东西,但你也可以开始为它添加内容。

也像Pavel Strakhov所说,QMainWindow必须在对象树上没有父母。

同样一般来说,我发现在不使用Qt Designer和ui代的情况下管理和处理大型项目更容易。大多数示例也不使用生成的ui内容。

另一方面,开始使用QML和QtQuick进行GUI的工作也很大,但QWidget功能不会很快消失。

希望有所帮助。