在多界面的软件中,有时候各个不同的界面来回跳转,通过简单的信号与槽方法实现界面的显示以及隐藏感觉代码会很凌乱,看起来会有点费劲。这个时候你可能就需要一个界面管理类来实现界面的管理,方便你界面的显示、隐藏以及上一个界面的回退。也可以避免多界面的耦合事件发生,导致后期代码维护的困难。
因为本人也是第一次写这种类,可能里面会有很多不完善,希望做过的或者有其他建议的大佬,可以指出不足
一开始想着在这个类中,直接对各个界面进行实例化管理,负责界面的调度,后来在开发中发现,这种方法行不通,首先管理类和界面类的互相访问,头文件部分就会发生冲突,两边都引用各自的头文件后头文件部分的#ifndef #define #endif
部分就不报错,报错类型 unterminated conditional directive
一开始查找这个错误,还在那一脸闷逼,说的都是什么,缺少#endif
实践后才发现,这个原因也有可能是头文件相互嵌套导致的问题。
后来想着要不要在每个类中标记个什么字符串了,整型了作为唯一标识符,然后调用。最后又一想为什么要这么麻烦,为什么不直接在管理类中,标记两个字符串,一个作为当前要显示的界面,一个作为上个显示过的界面,然后根据要显示的类型直接发送信号,然后每个界面判断这个信号是不是要自己显示,是的话就显示,多简单,后来就这样直接做了,而且效果还不错。
但是有2点需要注意的
- 最好管理类弄成单例模式,避免你界面太多,实例化太多造成资源浪费
- 一个信号多个界面接受,可能会造成界面显示延迟,估计应该不会太长
下面上代码:
.h文件
class ManageShowWidget:public QWidget
{
Q_OBJECT
public:
static ManageShowWidget* m_pManageShowWidget;
static ManageShowWidget* getInstance();
void getShowWidget();
void setShowWidget(const QString& strShowWidget);
void getOldShowWidget();
void setOldWidget(const QString& strOldShowWidget);
signals:
void emitShowWidget(QString);
void emitOldShowWidget(QString);
private:
ManageShowWidget();
QString m_strShowWidget;
QString m_strOldShowWidget;
};
.cpp文件
ManageShowWidget* ManageShowWidget::m_pManageShowWidget = nullptr;
ManageShowWidget* ManageShowWidget::getInstance()
{
if(nullptr == m_pManageShowWidget)
m_pManageShowWidget = new ManageShowWidget();
return m_pManageShowWidget;
}
void ManageShowWidget::getShowWidget()
{
emit emitShowWidget(m_strShowWidget);
}
void ManageShowWidget::setShowWidget(const QString &strShowWidget)
{
m_strShowWidget = strShowWidget;
}
void ManageShowWidget::getOldShowWidget()
{
emit emitOldShowWidget(m_strOldShowWidget);
}
void ManageShowWidget::setOldWidget(const QString &strOldShowWidget)
{
m_strOldShowWidget = strOldShowWidget;
}
ManageShowWidget::ManageShowWidget()
:m_strShowWidget("MainWidget")
,m_strOldShowWidget("MainWidget")
{
}