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();
3 Réponses :
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;
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;
J'ai une autre question. Quand j'essaye ce "qDebug (globelusername.toLatin1 ())", dans le fichier userdetails.cpp obtenir une valeur nulle.
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; }
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.