Qt C++ 类的嵌套和外部指针变量


前言
· 为了在 Qt 内的其他函数中也能正常的使用 MainWindow w 这个对象

1 extern 指针变量

· 可是直接都把使用 MainWindow w 的行为都写在 MainWindow w 本身中不就可以完美的解决了吗?
· 但是有些特殊的条件,你没办法把这个行为写在 MainWindow w 本身中,就只能采取 extern 指针变量的方法(eg:Linux 中的信号处理服务函数,就无法写入MainWindow w 本身中,但该函数又要使用 MainWindow w 就需采取当前的方法 )

· 我首先想到的是把 MainWindow w 变成外部变量,但是这是无法做到的!
·
· MainWindow w 是必须在 QApplication a(argc, argv) 后创建的,不然编译器会报错,所以只能在 main 函数中局部的创建 MainWindow w
· 虽然没办法把 MainWindow w 变成外部变量,但是可以创建指向 MainWindow w 外部指针,指针在 MainWindow w 的解析函数中初始化

1.1 定义指针

/* main.cpp */
MainWindow *ww = NULL;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

· 在 main.cpp 中创建 MainWindow *ww 指针

1.2 声明指针

/* mainwindow.h */
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

extern MainWindow *ww;

#endif // MAINWINDOW_H

· 在 mainwindow.h 声明外部变量 ww

1.3 初始化指针

/* mainwindow.cpp */
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    extern MainWindow *ww;
    ww = this;
    
    ui->setupUi(this)}

· 在 MainWindow 的解析函数中初始化 ww 指针

1.4 调用指针

/* mycode.cpp */
#include "mainwindow.h"

void trytry(void){
	extern MainWindow *ww;
	ww->function();
}

· 其他源文件在包含 mainwindow.h 的头文件后,即可通过指针的形式访问 MainWindow w

2 class 类的嵌套

· 若是认为指针的传递局部变量的行为存在安全隐患,直接在 MainWindow 类中添加对应的函数或是使用类的嵌套也能实现使用
· 但我更倾向于嵌套的使用类,对于我来说这样框架更清晰可见

2.1 嵌套类并添加嵌套对象指针

/* mainwindow.h */
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    class TRY{
    public:
    	void show(void);
    protected:
    private:
    };
    TRY *try;
private slots:
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

· 在 mainwindow.h 中添加 TRY 类,并添加 TRY *try 指针

2.2 初始化对象指针和实现嵌套类

/* mainwindow.cpp */
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    try = new TRY();
}

MainWindow::~MainWindow()
{
    delete try;
    delete ui;
}

void MainWindow::TRY::show(void){
	// code
}

· 在 mainwindow.cpp 的解析函数中初始化 TRY *try 指针和在析构函数中释放 TRY *try 指针,并实现嵌套的类

2.3 使用嵌套类

/* main.cpp */
MainWindow *ww = NULL;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w::try->show();
    w.show();

    return a.exec();
}

· 在 main.cpp 中使用嵌套的类

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值