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的方法是可行的。
相關文章
- 同一會話中的多個 WebRequest會話Web
- python中getattr如何帶引數呼叫?Python
- 12.MyBatis學習--對映檔案_引數處理_單個引數&多個引數&命名引數MyBatis
- CompletableFuture中實現多個 REST 呼叫REST
- SpringMVC中@RequestBody接收前端傳來的多個引數SpringMVC前端
- dubbo泛化呼叫導致zk中同一個消費者節點數遞增
- C#通過反射獲取類中的方法和引數個數,反射呼叫方法帶引數C#反射
- CSV Data Set Config 引數化怎麼從多個檔案中讀取資料?
- mybatis基礎03(介面中的多個引數處理)MyBatis
- 多個excel檔案合併到一個檔案中的多個sheet表中Excel
- .net 中的 Dto 引數封裝物件 使用封裝物件
- 如何用python判斷列表中是否包含多個字串中的一個或多個?Python字串
- 一個例項中,多個synchronized方法的呼叫synchronized
- Mybatis(五)--原始碼分析傳入單個list引數和多個list引數寫法MyBatis原始碼
- vue 中 watch如何監聽陣列或物件中的某個值?Vue陣列物件
- 【YashanDB知識庫】繫結引數,同一個sql多個執行計劃的問題SQL
- C語言關於多原始檔的呼叫C語言
- redis配置檔案中各引數詳解Redis
- 同一個專案中的多個Spring Boot應用實現CQRS - itnextSpring Boot
- 在 React 中管理同一元件的多個例項中的狀態React元件
- 在同一臺計算機中執行多個MySQL服務計算機MySql
- 在Linux中呼叫MapReduce對檔案中各個單詞出現次數進行統計Linux
- 詳解SSH 框架中物件呼叫流程框架物件
- Qt - 訊號與槽的第五個引數QT
- mybatis 的傳入引數如何既有物件又有單個引數MyBatis物件
- mybatis 傳入多個引數MyBatis
- Python中將函式作為另一個函式的引數傳入並呼叫Python函式
- <input type="file"> 選中多個檔案
- c++中物件的引用作為函式的引數C++物件函式
- mybatis中mapper.xml檔案引數問題MyBatisAPPXML
- VS中呼叫QT出現This application failed to start because it could not find or load the Qt platform pluginQTAPPAIPlatformPlugin
- 使用自定義委託來呼叫Lua中的多返回值和長引數型別函式型別函式
- 伺服器中的幾個重要引數伺服器
- javascript變數物件函式呼叫棧作用域閉包等細解!JavaScript變數物件函式
- exp和expdp的filesize引數的使用--匯出多個檔案
- Swift 使用lexicographicallyprecedes 多個引數排序Swift排序
- 巨集定義跟多個引數
- 29.qt quick-在QML中呼叫C++類QTUIC++