Qt中多個原始檔中呼叫同一引數或物件等

friedrichor發表於2020-12-30

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;
}

執行結果如下:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
(程式稍微有些問題,但可以看出 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的方法是可行的。

相關文章