如何在Qt中分层独立的小部件?

Vic*_*tor 5 c++ user-interface qt

我正在使用Qt创建一个应用程序,它包含一个用作应用程序背景的小部件,以及一个浮动在上面的用户控制界面.

类似的示例是谷歌地图,其中地图位于背景上,控件位于背景之上.

但问题是背景小部件可以更改为不同的小部件(有一个显示地图的小部件,另一个显示视频输入的小部件,......)

对于用户控制界面中的按钮也会发生同样的事情,它们与当前背景没有直接关系,可以通过动态更改.

我尝试使用QStackedLayout,使用两个层,后台小部件和用户控制界面.但是您无法与背景图层进行交互,因为前面的窗口小部件会阻止所有点击.

有什么建议?

Ian*_*ros 1

您的问题太笼统,无法为您提供具体的答案,但最明显的解决方案是为系统的每个可能的组件实现从 QWidget 继承的类。在你的例子中,我可以想象两个不同的组件:背景和控件。背景将存储所有图像数据,例如地图和视频,而控件将具有与系统交互的按钮。您甚至可以将背景分为不同的类别来管理图像或视频。我建议使用继承自 QObject 的中央 GUIController 类来管理所有界面交互,例如连接信号/槽或实现任何动画,这样您就可以添加/管理多个小部件,而无需通过不同的 .cpp。

编辑:根据您的评论,您的主要问题似乎是您的鼠标事件没有按照您的预期传播到您的小部件。原因可能是您没有设置组件之间的父/子关系。确保您在自定义小部件类中调用默认的 QWidget 构造函数,如下所示:

CustoWidget(QWidget *parent = 0, Qt::WFlags flags = 0) : QWidget(parent, flags)
{
//your code here
}
Run Code Online (Sandbox Code Playgroud)

创建 Controller 类时,设置组件之间的正确关系。在您的系统上下文中,我认为所有组件都将添加为背景子组件,因此如下所示:

class Controller : public QObject
{
public:
   Controller(QObject *parent = 0, Qt::WFlags flags = 0) : QObject(parent, flags)
   {
     wdg_back_= new BackWidget(this);
     wdg_control_ = new Controls(wdg_back);
     wdg_1_ = new GenericWidget(wdg_back);

     //connect your signals/slots, etc
   }

private:
   BackWidget *wdg_back_;
   Controls *wdg_control_;
   GenericWidget *wdg_1_;
}
Run Code Online (Sandbox Code Playgroud)