Salam Wa Alikom
大家好:):
我想使用SIGNAL和SLOT连接到Windows,这样我就可以将变量从第一个窗口传递到第二个窗口
我想把line {1}的值从login.cpp传递给menu.cpp
我有2个窗口
login.ui 和 menu.ui
这是login.h
nom
login.cpp
#ifndef LOGIN_H
#define LOGIN_H
#include <QMainWindow>
#include <QtSQl>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QFileInfo>
#include <QDialog>
#include "menu.h"
namespace Ui {
class login;
}
class login : public QMainWindow
{
Q_OBJECT
public:
explicit login(QWidget *parent = 0);
~login();
private slots:
void on_pushButton_clicked();
private:
Ui::login *ui;
Menu *menu;
QSqlDatabase db;
};
#endif // LOGIN_H
和menu.h
#include "login.h"
#include "ui_login.h"
#include "QPixmap"
#include "QCryptographicHash"
#include <QDialog>
login::login(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::login)
{
ui->setupUi(this);
connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),
ui->spinBox,SLOT(setValue(int)));
// logos header
QPixmap isem_img("C:/Users/Amine/Documents/QT/E-LogBook/resource/img/ISEM.png");
ui->img_ISEM->setPixmap(isem_img);
QPixmap mm_img("C:/Users/Amine/Documents/QT/E-LogBook/resource/img/MM.png");
ui->img_MM->setPixmap(mm_img);
// Connexion database
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setUserName("root");
db.setPassword("");
db.setDatabaseName("journal_machine");
// ouverture database
if(db.open())
{
ui->label_db_status->setText("Connecté");
}else{
ui->label_db_status->setText("Connexion echoué");
}
}
login::~login()
{
delete ui;
}
void login::on_pushButton_clicked()
{ menu = new Menu(this);
menu ->show();
QString password,nom,password_db;
nom = ui->lineEdit_nom->text();// get data from input
password = ui->lineEdit_password->text();// get data from input
if (password == NULL || nom == NULL){ // si les cases sont vides
ui->label_etat->setText("Champ non rempli");
} else
{
QSqlQuery query;
query.exec("SELECT * FROM `equipage` WHERE Nom='"+nom+"'");// Query
if (query.next() == true) {
password_db = query.value(2).toString(); // get value from mysql
QString password_md5 = QString(QCryptographicHash::hash((password.toUtf8()),QCryptographicHash::Md5).toHex());// cryptage du password
if (password_md5 == password_db) {// si le mot de pass est correct
// this->hide();
} else {
// si le mot de pass est faux
}
}
query.finish();
}
}
menu.cpp
#ifndef MENU_H
#define MENU_H
#include <QMainWindow>
namespace Ui {
class Menu;
}
class Menu : public QMainWindow
{
Q_OBJECT
public:
explicit Menu(QWidget *parent = 0);
~Menu();
private slots:
void on_pushButton_2_clicked();
private:
Ui::Menu *ui;
};
#endif // MENU_H
最终的主要内容
#include "menu.h"
#include "ui_menu.h"
#include "login.h"
Menu::Menu(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Menu)
{
ui->setupUi(this);
}
Menu::~Menu()
{
delete ui;
}
提前致谢 Chokran:)
答案 0 :(得分:0)
似乎你需要先了解SIGNAL和SLOTS是什么。
connect()
方法的工作方式类似于特定SIGNAL被设置时,相应的SLOT被调用。
语法:
QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)
示例:
connect(yourobj,SIGNAL(destroyed(QObject*)),this,SLOT(your method/function));
在您输入connect()
时使用SIGNAL()
时,Qt编辑器会自动显示与您的对象相关的信号,当您输入SLOT()
时,它会显示您班级中可用的方法。
答案 1 :(得分:0)
在login.h中创建一个发送nom值的信号。
#ifndef LOGIN_H
#define LOGIN_H
#include <QMainWindow>
#include <QtSQl>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QFileInfo>
#include <QDialog>
#include "menu.h"
namespace Ui {
class login;
}
class login : public QMainWindow
{
Q_OBJECT
public:
explicit login(QWidget *parent = 0);
~login();
private slots:
void on_pushButton_clicked();
signals: // <-------
void loginButtonClicked(int nomVal); // <-------
private:
Ui::login *ui;
Menu *menu;
QSqlDatabase db;
};
在菜单类中,创建要从登录信号执行的插槽,并使用变量存储nom值。
#ifndef MENU_H
#define MENU_H
#include <QMainWindow>
namespace Ui {
class Menu;
}
class Menu : public QMainWindow
{
Q_OBJECT
public:
explicit Menu(QWidget *parent = 0);
~Menu();
private slots:
void on_pushButton_2_clicked();
void loginButtonClicked(int nomVal); //<-----------
private:
Ui::Menu *ui;
int nomValue; //<-----------
};
#endif // MENU_H
#include "menu.h"
#include "ui_menu.h"
#include "login.h"
Menu::Menu(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Menu)
{
ui->setupUi(this);
}
void Menu::loginButtonClicked(int nomVal)
{
nomValue = nomVal;
}
Menu::~Menu()
{
delete ui;
}
在login.cpp中,将信号连接到插槽并发出信号。
#include "ui_login.h"
#include "QPixmap"
#include "QCryptographicHash"
#include <QDialog>
login::login(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::login)
{
ui->setupUi(this);
connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),
ui->spinBox,SLOT(setValue(int)));
// logos header
QPixmap isem_img("C:/Users/Amine/Documents/QT/E-LogBook/resource/img/ISEM.png");
ui->img_ISEM->setPixmap(isem_img);
QPixmap mm_img("C:/Users/Amine/Documents/QT/E-LogBook/resource/img/MM.png");
ui->img_MM->setPixmap(mm_img);
// Connexion database
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setUserName("root");
db.setPassword("");
db.setDatabaseName("journal_machine");
// ouverture database
if(db.open())
{
ui->label_db_status->setText("Connecté");
}else{
ui->label_db_status->setText("Connexion echoué");
}
connect(this,SIGNAL(loginButtonClicked(int)),menu,SLOT(loginButtonClicked(int))); //<-------
}
login::~login()
{
delete ui;
}
void login::on_pushButton_clicked()
{ menu = new Menu(this);
menu ->show();
QString password,nom,password_db;
nom = ui->lineEdit_nom->text();// get data from input
emit loginButtonClicked(nom); //<--------
password = ui->lineEdit_password->text();// get data from input
if (password == NULL || nom == NULL){ // si les cases sont vides
ui->label_etat->setText("Champ non rempli");
} else
{
QSqlQuery query;
query.exec("SELECT * FROM `equipage` WHERE Nom='"+nom+"'");// Query
if (query.next() == true) {
password_db = query.value(2).toString(); // get value from mysql
QString password_md5 = QString(QCryptographicHash::hash((password.toUtf8()),QCryptographicHash::Md5).toHex());// cryptage du password
if (password_md5 == password_db) {// si le mot de pass est correct
// this->hide();
} else {
// si le mot de pass est faux
}
}
query.finish();
}
}
所以,无论何时按下登录窗口上的按钮,都会发出信号。该信号连接到菜单窗口中的一个插槽,它将携带nom值到该插槽。连接是在登录窗口中声明的菜单窗口。