Qt中多個原始檔中呼叫同一引數或物件等
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的方法是可行的。
相關文章
- 在多個檔案中import同一個檔案,webpack會多次打包嗎ImportWeb
- 同一會話中的多個 WebRequest會話Web
- 微信小程式中如何使用setData修改陣列或物件中的某一引數微信小程式陣列物件
- python中getattr如何帶引數呼叫?Python
- 在 Angularjs 中 ui-sref 和 $state.go 如何傳遞單個多個引數和將物件作為引數AngularJSUIGo物件
- Qt中連線到同一signal的多個slots的執行順序問題QT
- 如何在mybatis 中傳多個引數,如何在mybatis 中遍歷 集合?MyBatis
- ObjectStateManager 中已存在具有同一鍵的物件。ObjectStateManager 無法跟蹤具有相同鍵的多個物件Object物件
- C#通過反射獲取類中的方法和引數個數,反射呼叫方法帶引數C#反射
- SpringMVC中@RequestBody接收前端傳來的多個引數SpringMVC前端
- mybatis基礎03(介面中的多個引數處理)MyBatis
- 12.MyBatis學習--對映檔案_引數處理_單個引數&多個引數&命名引數MyBatis
- CompletableFuture中實現多個 REST 呼叫REST
- 多個excel檔案合併到一個檔案中的多個sheet表中Excel
- Qt 訊號槽如何傳遞引數(或帶引數的訊號槽)QT
- static函式塊中如何呼叫外部xml引數?函式XML
- 繼承中引數傳遞及呼叫順序繼承
- 一個例項中,多個synchronized方法的呼叫synchronized
- .net 中的 Dto 引數封裝物件 使用封裝物件
- 如何用python判斷列表中是否包含多個字串中的一個或多個?Python字串
- rails中傳遞多個引數破壞了 restful原則?AIREST
- java 中對物件的呼叫Java物件
- 同一個SQL引發多個ORA-7445錯誤SQL
- webService學習(二)—— 呼叫自定義物件引數Web物件
- Qt 中的多執行緒QT執行緒
- ASP中函式呼叫對引數的影響 (轉)函式
- vue 中 watch如何監聽陣列或物件中的某個值?Vue陣列物件
- Mybatis(五)--原始碼分析傳入單個list引數和多個list引數寫法MyBatis原始碼
- 可否在JSP中向applet傳遞多個引數?JSAPP
- CSV Data Set Config 引數化怎麼從多個檔案中讀取資料?
- nginx多個專案放在不同的tomcat中,共享同一個埠NginxTomcat
- QTP中如何快速獲取Page中的物件個數QT物件
- 在DWR中呼叫Http Servlet 物件HTTPServlet物件
- 關於packages中多個同名程式(procedure)的呼叫Package
- QT中QProcess呼叫命令列的痛苦經歷QT命令列
- QT資原始檔QT
- redis配置檔案中各引數詳解Redis
- 在 React 中管理同一元件的多個例項中的狀態React元件