赞
踩
略
主界面需要继承 QMainWindow
这个ui只需要一个空的界面就好
排版可以用splitDockWidget
田字形的排版如下:
加入第一个QDockWidget ,也就是左上角
this->addDockWidget(Qt::LeftDockWidgetArea, pDock1 );
横向扩展一个,即右上角。在第一个QDockWidget 横向插入一个QDockWidget
splitDockWidget(pDock1 , pDock2, Qt::Horizontal);
左下角
//第一竖列
splitDockWidget(pDock1 , pDock3, Qt::Vertical);
右下角
//第二竖列
splitDockWidget(pDock2, pDock4, Qt::Vertical);
整体代码如下:
h文件
#pragma once #include <QMainWindow> #include<QDockWidget> #include "ui_WidStageCtrl.h" class WidStageCtrl : public QMainWindow { public: WidStageCtrl(QWidget *parent = Q_NULLPTR); ~WidStageCtrl(); protected: void InitData(); void removeAllDock(); private: Ui::WidStageCtrl ui; QList<QDockWidget*> m_docks;//< 记录所有dockWidget的指针 };
cpp文件
WidStageCtrl::WidStageCtrl(QWidget *parent ):QMainWindow(parent) { ui.setupUi(this); InitData(); } WidStageCtrl::~WidStageCtrl() { } void WidStageCtrl::InitData() { QDockWidget *pDock1 = new QDockWidget( QStringLiteral("界面1")); QWidget1*Widget1= new QWidget1(pDock1 ); pDock1 ->setWidget(Widget1); m_docks.append(pDock1); QDockWidget *pDock2 = new QDockWidget( QStringLiteral("界面2")); QWidget2*Widget2= new QWidget2(pDock2 ); pDock2 ->setWidget(Widget2); m_docks.append(pDock2); QDockWidget *pDock3 = new QDockWidget( QStringLiteral("界面3")); QWidget3*Widget3= new QWidget1(pDock3 ); pDock3 ->setWidget(Widget3); m_docks.append(pDock3); QDockWidget *pDock4 = new QDockWidget( QStringLiteral("界面4")); QWidget4*Widget4= new QWidget4(pDock4 ); pDock4 ->setWidget(Widget4); m_docks.append(pDock4); //初始布局 //第一横排 this->addDockWidget(Qt::LeftDockWidgetArea, pDock1 ); splitDockWidget(pDock1 , pDock2, Qt::Horizontal); //第一竖列 splitDockWidget(pDock1 , pDock3, Qt::Vertical); //第二竖列 splitDockWidget(pDock2, pDock4, Qt::Vertical); } void WidStageCtrl::removeAllDock() { for (int i = 0; i < m_docks.size(); ++i) { removeDockWidget(m_docks[i]); } }
这些界面虽然是分开的,但是很多操作却是关联到一起的,还有一些子界面给子界面发消息的功能。
如果我在每个界面直接处理业务逻辑的话很麻烦。
为了能统一,方便以后改代码。新建一个Signals类
#define INST_Signals Signals ::Instance()
class Signals : public QObject
{
Q_OBJECT
public:
static Signals * Instance();
static void Close();
private:
static Signals * m_pSingletion;
public:
~CSignals();
}
所有的子界面的槽函数,都不直接处理业务,而是交给Signals 发送
比如:
子界面
#include "Signals.h"
void service1(QString str)
{
INST_Signals->service1(str);
}
Signals.h 转发信号
void Signals::service1(QString str)
{
emit service1(str);
}
主界面:
#include "Signals.h"
connect(INST_CSignals, SIGNAL(service1(QString)), this, SLOT(SLOT_service1(QString));
这样就可以在主界面统一处理了
补:单例模式的实现
Signals* Signals::m_pSingletion = NULL; Signals* Signals::Instance() { if (m_pSingletion == NULL) { m_pSingletion = new Signals; } return m_pSingletion; } void Signals::Close() { if (m_pSingletion != NULL) { delete m_pSingletion; m_pSingletion = NULL; } }
还有一个思路统一处理
新建一个处理类 CtrlClass
在主界面的类里面 定义全局变量,并初始化
#include "CtrlClass.h"
CtrlClass* g_CtrlClass = NULL;
WidStageCtrl ::WidStageCtrl ()
在子界面里面使用它
extern CtrlClass* g_CtrlClass;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。