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的方法是可行的。