2016-05-06 50 views
0

萨拉姆娲AlikomSIGNAL和2个窗口之间SLOT QT

您好老少:)

我想连接到使用SIGNAL和SLOT,以便可以通过第一窗口传递变量到所述第二窗窗

正是我想从login.cpp的lineEDIT合格nom价值menu.cpp

我有2个窗户

login.ui 和 menu.ui

这是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(); 


private: 
    Ui::login *ui; 
    Menu *menu; 
    QSqlDatabase db; 
}; 

#endif // LOGIN_H 

login.cpp

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

private: 
    Ui::Menu *ui; 
}; 

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


} 
Menu::~Menu() 
{ 
    delete ui; 
} 

finaly的main.cpp提前

#include "login.h" 
#include "menu.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    login w; 
    Menu z; 
    w.show(); 
    z.show(); 
    return a.exec(); 
} 

感谢 Chokran :)

+0

显然你需要写'connect'来连接信号和插槽,你的问题是什么? – fghj

+0

我不知道该怎么做^^ –

+0

在你的代码里有'connect'的调用,如果你不知道如何去做,你怎么写呢? – fghj

回答

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 

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

0

看来你需要了解的第一件事信号和插槽是。

connect()方法的工作方式就像特定信号被提取时一样,相应的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()它会显示您的班级内可用的方法。

+0

嗨非常感谢您的时间,我不知道如何连接2 Windows –

相关问题