1
votes

Références non définies à une variable globale dans QT C ++

J'essaie de transmettre la valeur de la chaîne de mainwindow.cpp à userdetails.cpp. J'avais été utilisé variable globale. Et lorsque le programme s'exécute, il affiche le message d'erreur " Références non définies à globelusername ". globelusername signifie le nom de la variable globale. Quelle est l'erreur de code?

mainwindow.h

#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;

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

    #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();


6 commentaires

Vous ne devez pas utiliser de variable globale pour cela en premier lieu.


de plus, vous utilisez qt, pourquoi ne pas éviter le global et essayer un signal / slot sur l'événement dont vous avez besoin? mais en effet, vous devez toujours définir votre global, après l'avoir déclaré :)


Est-ce que cela répond à votre question? Comment utiliser extern pour partager des variables entre les sources fichiers?


aucune raison de faire ça comme ça ... vous créez un code spaghetti avec des dépendances cycliques ...


J'ai compris. Merci


J'ai une autre question. Quand j'essaye ce "qDebug (globelusername.toLatin1 ())", dans le fichier userdetails.cpp obtenir une valeur nulle.


3 Réponses :


1
votes

Cette ligne

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

QString globelusername;

// ...

déclare simplement une variable globale mais ne la définit pas.

Vous devez la définir dans l'un de vos .cpp em> fichier (par exemple dans mainwindow.cpp):

extern QString globelusername;


0 commentaires

1
votes

Vous avez déclaré une variable globale en haut de votre fichier d'en-tête

globelusername = username;

Mais vous ne la définissez jamais.

Vous avez des définitions locales dans les fonctions, mais celles les variables ne sont pas celles globales auxquelles vous pensez probablement attribuer. Ce ne sont que des variables temporaires qui disparaissent lorsque la portée englobante de la fonction retourne:

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

QString globelusername;  // add this line


MainWindow::MainWindow(QWidget *parent)

Pour corriger, définissez ceci en haut de mainwindow.cpp :

QString globelusername = username; //globlevariable

Ensuite, à tous les endroits où vous définissez globelusername dans une fonction, changez-le pour simplement référencer la variable en haut (c'est-à-dire supprimez la suppression de type QString pour que le compilateur le sache. être un devoir et non une nouvelle variable)

extern QString globelusername;


1 commentaires

J'ai une autre question. Quand j'essaye ce "qDebug (globelusername.toLatin1 ())", dans le fichier userdetails.cpp obtenir une valeur nulle.



1
votes

vous photographiez votre propre pied,

regardez attentivement que MainWindows.h inclut un Userdetails.h et que les détails de l'utilisateur incluent un MainWindows.h est appelé dans le logiciel dev. dépendances cycliques et c'est très très mauvais!

à la place, définissez une Qstring comme un objet / variable membre dans la fenêtre principale ET dans les Userdetails, définissez après cela un setter dans la classe UserDetails, puis dans le mainWindows vous peut passer cela comme paramètre:

dans uderDetail

this->myUserDetails->show(); //exec() or similar

et dans MainWindows

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

}

et plus tard, faites

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


0 commentaires