QT C++ 中对全局变量的未定义引用
Undefined references to global variable in QT C++
我尝试将字符串值从 mainwindow.cpp 传递到 userdetails.cpp。我一直在使用全局变量。当程序 运行 时,它显示错误消息“未定义对 globelusername 的引用”。 globelusername 表示全局变量名。代码有什么错误?
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "register.h"
#include "userdetails.h"
//#include <QtSql>
//#include <QSqlDatabase>
//#include <QMessageBox>
extern QString globelusername;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui ->loginusername->setPlaceholderText("Username");
ui ->loginpassword->setPlaceholderText("Password");
QString username = ui ->loginusername ->text();
QString globelusername = username;
return ;//
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//open new registration in new window
hide();
regist = new Register(this);
regist ->show();
}
void MainWindow::on_pushButton_2_clicked()
{
//database connection
.....
QString username = ui ->loginusername ->text();
QString password = ui ->loginpassword ->text();
if(db.open()){
//query create
QSqlQuery query(QSqlDatabase::database("MyConnect"));
query.prepare(QString("SELECT * FROM user_reg_elec WHERE username = :username AND password = :password"));
query.bindValue(":username", username);
query.bindValue(":password", password);
QString globelusername = username; //globlevariable
}
userdetails.cpp
#include "userdetails.h"
#include "ui_userdetails.h"
#include <QSqlError>
#include "mainwindow.h"
Userdetails::Userdetails(QWidget *parent) :
QDialog(parent),
ui(new Ui::Userdetails)
{
ui->setupUi(this);
}
Userdetails::~Userdetails()
{
}
void Userdetails::on_pushButton_4_clicked()
{
{
// database connection
........
QString abc = globelusername;
这一行
extern QString globelusername;
只是声明了一个全局变量,并没有定义它。
您必须在您的 .cpp 文件之一中定义它(例如在 mainwindow.cpp 中):
#include "mainwindow.h"
#include "ui_mainwindow.h"
QString globelusername;
// ...
您在头文件的顶部声明了一个全局变量
extern QString globelusername;
但你永远不会定义它。
您在函数中有局部定义,但这些变量并不是您可能认为要分配给的全局变量。它们只是临时变量,当函数的封闭范围 returns:
时就会消失
QString globelusername = username; //globlevariable
要修复,请在 mainwindow.cpp
的顶部定义:
#include "mainwindow.h"
#include "ui_mainwindow.h"
QString globelusername; // add this line
MainWindow::MainWindow(QWidget *parent)
然后在函数中定义 globelusername 的所有地方将其更改为仅引用顶部的变量(即删除 QString 类型声明,以便编译器知道它是一个赋值而不是一个新变量)
globelusername = username;
你这是在射自己的脚,
仔细看,MainWindows.h
包含一个 Userdetails.h
,用户详细信息包含一个 MainWindows.h,在软件开发中调用。循环依赖,非常非常糟糕!
相反,将 Qstring 定义为主要 Window 中的成员 object/variable 并且在 Userdetails 中,然后在 UserDetails class 中定义一个 setter,然后在 mainWindows 中,您可以将其作为参数传递:
在 uderDetail
Userdetails::setName(const QString& name)
{
this->name=name;
}
并在主要Windows
MainWindow::foo()
{
this->myUserDetails->setName(this->name);
}
以后做
this->myUserDetails->show(); //exec() or similar
我尝试将字符串值从 mainwindow.cpp 传递到 userdetails.cpp。我一直在使用全局变量。当程序 运行 时,它显示错误消息“未定义对 globelusername 的引用”。 globelusername 表示全局变量名。代码有什么错误?
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "register.h"
#include "userdetails.h"
//#include <QtSql>
//#include <QSqlDatabase>
//#include <QMessageBox>
extern QString globelusername;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui ->loginusername->setPlaceholderText("Username");
ui ->loginpassword->setPlaceholderText("Password");
QString username = ui ->loginusername ->text();
QString globelusername = username;
return ;//
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//open new registration in new window
hide();
regist = new Register(this);
regist ->show();
}
void MainWindow::on_pushButton_2_clicked()
{
//database connection
.....
QString username = ui ->loginusername ->text();
QString password = ui ->loginpassword ->text();
if(db.open()){
//query create
QSqlQuery query(QSqlDatabase::database("MyConnect"));
query.prepare(QString("SELECT * FROM user_reg_elec WHERE username = :username AND password = :password"));
query.bindValue(":username", username);
query.bindValue(":password", password);
QString globelusername = username; //globlevariable
}
userdetails.cpp
#include "userdetails.h"
#include "ui_userdetails.h"
#include <QSqlError>
#include "mainwindow.h"
Userdetails::Userdetails(QWidget *parent) :
QDialog(parent),
ui(new Ui::Userdetails)
{
ui->setupUi(this);
}
Userdetails::~Userdetails()
{
}
void Userdetails::on_pushButton_4_clicked()
{
{
// database connection
........
QString abc = globelusername;
这一行
extern QString globelusername;
只是声明了一个全局变量,并没有定义它。
您必须在您的 .cpp 文件之一中定义它(例如在 mainwindow.cpp 中):
#include "mainwindow.h"
#include "ui_mainwindow.h"
QString globelusername;
// ...
您在头文件的顶部声明了一个全局变量
extern QString globelusername;
但你永远不会定义它。
您在函数中有局部定义,但这些变量并不是您可能认为要分配给的全局变量。它们只是临时变量,当函数的封闭范围 returns:
时就会消失QString globelusername = username; //globlevariable
要修复,请在 mainwindow.cpp
的顶部定义:
#include "mainwindow.h"
#include "ui_mainwindow.h"
QString globelusername; // add this line
MainWindow::MainWindow(QWidget *parent)
然后在函数中定义 globelusername 的所有地方将其更改为仅引用顶部的变量(即删除 QString 类型声明,以便编译器知道它是一个赋值而不是一个新变量)
globelusername = username;
你这是在射自己的脚,
仔细看,MainWindows.h
包含一个 Userdetails.h
,用户详细信息包含一个 MainWindows.h,在软件开发中调用。循环依赖,非常非常糟糕!
相反,将 Qstring 定义为主要 Window 中的成员 object/variable 并且在 Userdetails 中,然后在 UserDetails class 中定义一个 setter,然后在 mainWindows 中,您可以将其作为参数传递:
在 uderDetail
Userdetails::setName(const QString& name)
{
this->name=name;
}
并在主要Windows
MainWindow::foo()
{
this->myUserDetails->setName(this->name);
}
以后做
this->myUserDetails->show(); //exec() or similar