两个窗口QT之间的SIGNAL和SLOT

时间:2016-05-06 23:48:35

标签: c++ qt variables

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:)

2 个答案:

答案 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值的信号。

login.h

#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值。

menu.h

#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

menu.cpp

#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中,将信号连接到插槽并发出信号。

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值到该插槽。连接是在登录窗口中声明的菜单窗口。