最近一直在用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
Tags: BeiTown, Mainwindow, QT, 获取主窗体