Qt中多个源文件中调用同一参数或对象等

以有mainwindows的程序为例

在main.cpp中main()函数外声明参数
在其他 .cpp 中用 extern

比如在main.cpp(可以是任何 .cpp/ .c文件)中,main()函数外声明

int x = 5;

在另一个.cpp中想要 调用(获取/改变/…) 这个x的值,在 .cpp 中使用

extern int x = 2*x;

这时就可以得到

x = 10

下面以我写的一个程序为例

(.h文件在文章尾)

main.cpp中代码:

#include "mainwindow.h"
#include "list.h"
#include <QApplication>

int ID = 1;          //多个文件要调用的参数
List* l = new List;  //多个文件要调用的对象

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

add.cpp中代码(大部分代码都对本篇文章没有太大用处,可以直接去找extern那部分,知道怎么用就可以了)

#include "add.h"
#include "ui_add.h"

add::add(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::add)
{
    ui->setupUi(this);
    QTimer* timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(timerUpdate()));
    timer->start(1000);
}

void add::timerUpdate()
{
    QDateTime current = QDateTime::currentDateTime();
    QString current_str = current.toString("yyyy-MM-dd hh:mm:ss dddd");
    ui->lineEdit_current->setText(current_str);
}

void add::on_pushButton_ok_clicked()
{

    extern int ID;    //想要调用main.cpp中声明的int ID
    extern List* l;   //想要调用main.cpp中声明的List* l
    
    int InOut = this->ui->lineEdit_money->text().toInt();
    double money = this->ui->lineEdit_money->text().toDouble();
    QString info = this->ui->lineEdit_info->text();
    Record r;
    r.id = QString("%1").arg(ID,4,10,QLatin1Char('0'));//id为四位整数的字符串,如9显示为"0009"
    
    //下面有对ID和l的信息进行更改
    ID++;
    if(InOut == 0)
        r.paymentType = "收入";
    else
        r.paymentType = "支出";
    r.money = money;
    r.info = info;
    if(InOut == 1){//收入
        l->totalIncome += money;
        l->balance += money;
    }
    else {//支出
        l->totalExpend += money;
        l->balance -= money;
    }
    r.currentTotalIncome = l->totalIncome;
    r.currentTotalExpend = l->totalExpend;
    r.currentBalance = l->balance;
    QDateTime current = QDateTime::currentDateTime();
    r.recordTime.year = current.date().year();
    r.recordTime.month = current.date().month();
    r.recordTime.day = current.date().day();
    r.recordTime.hour = current.time().hour();
    r.recordTime.minute = current.time().minute();
    r.recordTime.second = current.time().second();
    l->recordList.append(r);
}

void add::on_pushButton_cancel_clicked()
{
    close();
}

add::~add()
{
    delete ui;
}

showall.cpp代码:

#include "showall.h"
#include "ui_showall.h"

showAll::showAll(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::showAll)
{
    ui->setupUi(this);
    setWindowTitle("交易明细");
    this->model = new QStandardItemModel;
    this->ui->tableView->setModel(model);
    setHeader();
    doShowAll();
}

void showAll::setHeader()
{
    //设置表头
    this->model->setHorizontalHeaderItem(0,new QStandardItem("编号"));//第0列
    this->model->setHorizontalHeaderItem(1,new QStandardItem("收支类别"));//第1列
    this->model->setHorizontalHeaderItem(2,new QStandardItem("交易金额"));
    this->model->setHorizontalHeaderItem(3,new QStandardItem("备注"));
    this->model->setHorizontalHeaderItem(4,new QStandardItem("交易后余额"));
    this->model->setHorizontalHeaderItem(5,new QStandardItem("交易后总收入"));
    this->model->setHorizontalHeaderItem(6,new QStandardItem("交易后总支出"));
    this->model->setHorizontalHeaderItem(7,new QStandardItem("时间"));
    //设置列的宽度
    this->ui->tableView->setColumnWidth(0,70);
    this->ui->tableView->setColumnWidth(1,100);
    this->ui->tableView->setColumnWidth(2,100);
    this->ui->tableView->setColumnWidth(3,100);
    this->ui->tableView->setColumnWidth(4,100);
    this->ui->tableView->setColumnWidth(5,100);
    this->ui->tableView->setColumnWidth(6,100);
    this->ui->tableView->setColumnWidth(7,180);
}

void showAll::doShowAll()
{
    extern List* l;
    for (int i = 0;i < l->recordList.size();i++) {
        Record r = l->recordList.at(i);
        this->model->setItem(i,0,new QStandardItem(r.id));
        this->model->setItem(i,1,new QStandardItem(r.paymentType));
        this->model->setItem(i,2,new QStandardItem(QString::number(r.money)));
        this->model->setItem(i,3,new QStandardItem(r.info));
        this->model->setItem(i,4,new QStandardItem(QString::number(r.currentBalance)));
        this->model->setItem(i,5,new QStandardItem(QString::number(r.currentTotalIncome)));
        this->model->setItem(i,6,new QStandardItem(QString::number(r.currentTotalExpend)));
    }
}


showAll::~showAll()
{
    delete ui;
}

运行结果如下:

dispatch_once 如何调用多次 iOS 多次调用同一个函数_#include


dispatch_once 如何调用多次 iOS 多次调用同一个函数_qt_02


dispatch_once 如何调用多次 iOS 多次调用同一个函数_c++_03


(程序稍微有些问题,但可以看出 ID 和 l 在不同源文件的更改是有效的,所以extern是可行的)

list.h中代码:
(做的是一个简易的财务收支系统,以下代码无关紧要,可忽略)

#ifndef LIST_H
#define LIST_H

#include<QString>
#include<QList>
#include<QDateTime>
#include<QTimer>

typedef struct
{
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
}Time;//时间

typedef struct
{
    QString id;//记录编号
    QString paymentType;//收支类别,1-收入,2-支出
    double money;//单次收支的金额
    QString info;//备注信息
    Time recordTime;//添加记录的时间
    double currentTotalIncome;//交易后总收入
    double currentTotalExpend;//交易后总支出
    double currentBalance;//交易后余额
}Record;//单次收支记录

class List
{
public:
    List();
    QList<Record> recordList;
    double totalIncome;//总收入
    double totalExpend;//总支出
    double balance;//余额
};

#endif // LIST_H

add.h

#ifndef ADD_H
#define ADD_H

#include <QWidget>
#include "list.h"

namespace Ui {
class add;
}

class add : public QWidget
{
    Q_OBJECT

public:
    explicit add(QWidget *parent = nullptr);
    ~add();


public slots:
    void timerUpdate();//实时显示时间

private slots:
    void on_pushButton_ok_clicked();

    void on_pushButton_cancel_clicked();

private:
    Ui::add *ui;
};


#endif // ADD_H

showall.h

#ifndef SHOWALL_H
#define SHOWALL_H

#include "list.h"

#include <QDialog>
#include <QStandardItem>
#include <QStandardItemModel>

namespace Ui {
class showAll;
}

class showAll : public QDialog
{
    Q_OBJECT

public:
    explicit showAll(QWidget *parent = nullptr);
    ~showAll();
    void setHeader();
    void doShowAll();

private:
    Ui::showAll *ui;
    QStandardItemModel *model;
};

#endif // SHOWALL_H

我的部分代码确实有问题,但是只是对于我做的那个系统来说是有错误的,对于这篇文章的理解是没有任何影响的。

关于“多个源文件中调用同一参数或对象等”这个问题已经展示的比较明白了,那部分代码也可以通过运行结果看出来是没有问题的,extern的方法是可行的。