---------------------
作者:徐小hi
来源:CSDN
原文:https://blog.csdn.net/u010177010/article/details/50837067
版权声明:本文为博主原创文章,转载请附上博文链接!
在做到界面开发的过程中,往往需要通过子窗口去操作父窗口的问题。方法很多,大致实现下回调函数和类静态对象的使用。
在类的非静态函数的形参列表里,有个隐含的this指针,但是静态成员函数没有this指针,所以类的静态成员函数无法调用非静态的成员。要想在静态成员函数里调用成员,需要将当前的this指针传进去。在下面的例子都有实现。
每次创建类的对象都会相应的生成this指针,指向这个实例化对象。
直接上代码: (通过qt写的)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include "mainwindowson.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
static MainWindow *Instance();
static MainWindow *m_instance;
mainwindowson *ceshi;
void press(void * t,QString str);
void static setText(void *args,QString text);
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#define Ivdt_Com MainWindow::Instance()//可以使ceshi.cpp里面调用,方便别的cpp调用
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
ceshi = new mainwindowson();
ceshi->reg_cb(setText,this);//将该窗口的地址和函数传给子窗口
ceshi->exec();
}
void MainWindow::press(void * t,QString str)
{
MainWindow *pDownLoad = (MainWindow *)t;
pDownLoad->ui->lineEdit->setText(str);
int a = 123;
}
void MainWindow::setText(void *args,QString text)
{
MainWindow *pDownLoad = (MainWindow *)args;
pDownLoad->ui->lineEdit->setText(text);
//静态成员函数不存在this指针,所以将当前窗口指针传进来
}
MainWindow *MainWindow::Instance()
{
// if (!m_instance)
// {
// m_instance = new MainWindow();
// }
// return m_instance;
static MainWindow instance_;
return &instance_;//返回当前窗口对象的地址并不是当前的窗口地址是新的对象的地址
}
#ifndef MAINWINDOWSON_H
#define MAINWINDOWSON_H
#include
namespace Ui {
class mainwindowson;
}
typedef void(*up_func)(void *,QString text);
class mainwindowson : public QDialog
{
Q_OBJECT
public:
explicit mainwindowson(QWidget *parent = 0);
~mainwindowson();
up_func p_func;
void * p_args;
void reg_cb(up_func func,void *args = NULL)
{
p_func = func;
p_args = args;
}
private slots:
void on_pushButton_clicked();
private:
Ui::mainwindowson *ui;
};
#endif // MAINWINDOWSON_H
#include "mainwindowson.h"
#include "ui_mainwindowson.h"
#include "mainwindow.h"
mainwindowson::mainwindowson(QWidget *parent) :
QDialog(parent),
ui(new Ui::mainwindowson)
{
ui->setupUi(this);
}
mainwindowson::~mainwindowson()
{
delete ui;
}
void mainwindowson::on_pushButton_clicked()
{
Ivdt_Com->press(p_args,"press");
//p_func(p_args,"huidiao");
//Ivdt_Com->setText(p_args,"sds");
//p_args是mainwindow窗口的地址,通过在构造其子窗口的时候
//将地址传给子窗口,没有此地址,子窗口无法对父窗口进行操作
}
#include "mainwindow.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;//w的地址就是存在this指针
w.show();
return a.exec();
}