Неопределенные ссылки на глобальную переменную в QT C ++ - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь передать строковое значение из 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;

Ответы [ 3 ]

1 голос
/ 16 июня 2020

Вы объявили глобальную переменную в верхней части файла заголовка

extern QString globelusername;

Но вы никогда не определяете ее.

У вас есть локальные определения внутри функций, но эти переменные не t глобальный, который вы, вероятно, думаете, что назначаете. Это просто временные переменные, которые go удаляются, когда включающая область действия функции возвращает:

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;
1 голос
/ 16 июня 2020

вы стреляете собственной ногой,

внимательно посмотрите, что MainWindows.h включает Userdetails.h, а данные пользователя включают Main Windows .h, который вызывается в программном обеспечении dev. cycli c зависимостей и очень-очень плохо!

вместо этого определите Qstring как объект / переменную-член в главном окне И в Userdetails, определите после этого сеттер в классе UserDetails, затем в main Windows вы можете передать это как параметр:

в uderDetail

Userdetails::setName(const QString& name)
{
    this->name=name;
}

и в Main Windows

MainWindow::foo()
{
    this->myUserDetails->setName(this->name);

}

и более поздних версиях

this->myUserDetails->show(); //exec() or similar
1 голос
/ 16 июня 2020

Эта строка

extern QString globelusername;

просто объявляет глобальную переменную, но не определяет ее.

Вы должны определить ее в одном из ваших . cpp файл (например, в mainwindow. cpp):

#include "mainwindow.h"
#include "ui_mainwindow.h"

QString globelusername;

// ...
...