2016-05-06 76 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 –

相關問題