QT使用单例模式获取主窗体Mainwindow指针

最近一直在用QT做项目,信号和槽机制甚是好用,但是前提需求是在connect时必须同时传入Object1和Object2的指针(见《QT 多线程(UI线程)间的signal/slot(信号与槽)通信》),这样一来,我们如果需要在其他类中绑定Mainwindow的槽函数,则必须在该类初始化时传入Mainwindow的指针,甚是麻烦。甚至有时是间隔了好几个类。
查询了网络上的一些方法,稍微可行一些的是使用parentWidget()方法,但是还是没有从根本上解决全局获取Mainwindow指针的问题。
既然是全局,我们的基本解决思路就是static化,实现起来其实也非常简单,使Mainwindow变成单例即可,代码如下:

首先是Mainwindow.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    static MainWindow *GetInstance();//获取单例方法

private:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    Ui::MainWindow *ui;
    static MainWindow *m_pInstance;//单例指针

};

#endif // MAINWINDOW_H


接下来是MainWindow.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
MainWindow::~MainWindow()
{
    delete ui;
}

MainWindow* MainWindow::m_pInstance = NULL;

MainWindow * MainWindow::GetInstance(){
    if ( m_pInstance == NULL )
          m_pInstance = new MainWindow;
          return m_pInstance;
}

MainWindow* MainWindow::m_pInstance = NULL; 这里注意这句话如果不加上的话会出现错误:
mainwindow.obj:-1: error: LNK2001: 无法解析的外部符号 “private: static class MainWindow * MainWindow::m_pInstance” (?m_pInstance@MainWindow@@0PAV1@A)
因为静态数据成员属于类域内的全局变量,属于整个类共有,不属于特定的对象,因此必需要在类外进行初始化。

接下来我们就看下如何使用这个单例,见main.cpp

1
2
3
4
5
6
7
8
9
10
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow *w = MainWindow::GetInstance();
    w->show();
    return a.exec();
}

以上即在main中完成了对Mainwindow的全局指针获取。
同理,在connect信号和槽时,我们亦可使用MainWindow::GetInstance()获取MainWindow的指针,对其进行绑定。

本篇到此,欢迎大家交流及指正,谢谢关注。

BeiTown
2014.07.22

本文链接:QT使用单例模式获取主窗体Mainwindow指针

转载声明:BeiTown原创,转载请注明来源:BeiTown's Coder 编码之源,谢谢


Tags: , , ,

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>