2017-01-31 21 views
-4

私は顧客としてログインすると、列customer(その列の値は1)を非表示にしなければならないコードを書いています。私は信号にパラメータを渡す必要があります。 customerLoginisSaです。これらのパラメータを信号とスロットに渡すには?信号とスロット

Main.cpp

int main(int argc, char *argv[]) 
    { 
    QApplication a(argc, argv); 

    initialize(); 

    SafeOTPWindow w; 
    Login login; 
    login.connect(&login, SIGNAL(loggedIn()), &w, SLOT(show()) ); 
    login.connect(&login, SIGNAL(loginCancelled() ), &w, SLOT(close())); 

    login.show(); 
    a.exec(); 
} 

Login.h

#ifndef LOGIN_H 
#define LOGIN_H 

#include <QDialog> 

namespace Ui { 
class Login; 
} 

class Login : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit Login(QWidget *parent = 0); 
    ~Login(); 
    bool isSa; 

    signals: 
    void loggedIn(); 
    void loginCancelled(); 

    private slots: 
    void on_buttonBox_accepted(); 

    void on_buttonBox_rejected(); 

    private: 
    Ui::Login *ui; 
    }; 

#endif // LOGIN_H 

そして、ここで私がコラム(Customer)を非表示にする必要がある、私の別のファイル、OtpWindow.cppです:については

void SafeOTPWindow::initLogTable() 
    { 

    QList<OtpLog> logs; 
    int ret = otpRepo.fetchOtpLogs(logs); 
    if(ret != errorCodes::SUCCESS) 
    { 
     QMessageBox msgBox(QMessageBox::Critical, QString("SafeOTP"), 
         QString("OTPLogs could not be fetched"),QMessageBox::Ok, this); 
     msgBox.exec(); 
     QLOG_ERROR() << "fetchLogs error " << ret; 
     return; 
    } 

    QStandardItemModel *model = new QStandardItemModel(0,5,this); //5 columns 
    model->setHorizontalHeaderItem(0, new QStandardItem(QString("Date"))); 
    model->setHorizontalHeaderItem(1, new QStandardItem(QString("Customer"))); 
    model->setHorizontalHeaderItem(2, new QStandardItem(QString("Server"))); 
    model->setHorizontalHeaderItem(3, new QStandardItem(QString("Authorized by"))); 
    model->setHorizontalHeaderItem(4, new QStandardItem(QString("Description"))); 


     for(QList<OtpLog>::Iterator lIt = logs.begin(); lIt != logs.end(); lIt++) 
     { 
      OtpLog& log = *lIt; 
      QList<QStandardItem*> row; 
      row.push_back(new QStandardItem(log.when.toString("dd MMM yyyy, hh:mm"))); 
      row.push_back(new QStandardItem(QString(log.customer))); 
      row.push_back(new QStandardItem(QString(log.server))); 
      row.push_back(new QStandardItem(QString(log.author))); 
      row.push_back(new QStandardItem(QString(log.reason))); 

      model->appendRow(row); 
     } 
    // set the data model 
    ui->tblLog->setModel(model); 
    //Set the column to hide 
    ui->tblLog->setColumnHidden(1,true); 


    // set the column widths 
    int tw = ui->tblLog->width() - 5; 
    int w = tw/6; 

     for(int i=0; i<4;i++) 
     { 
     ui->tblLog->setColumnWidth(i,w); 
     tw -= w; 
     } 
    ui->tblLog->setColumnWidth(4,tw); 
    } 
+1

信号とスロットについてQtのドキュメントをお読みになりましたか?彼らは、その値が変化したときに信号を放出し、信号が新しい値を持つ簡単な 'Counter'クラスを持っています。 http://doc.qt.io/qt-5/signalsandslots.html –

+0

私はそれを試しましたが、私は上記の例でそれを使用する方法が混乱しています – cyley

+2

私はあなたの2番目の例を削除し、1つの問題に固執することをお勧めします。いったんソリューションがあれば、自分で2番目の問題を解決できるはずです – Tas

答えて

0

スロット/信号の例では、 o同じパラメータを持つ2つのオブジェクトを接続します。あなたのようなものがありますあなたのログインの方法で

signals: 
void loginStatusChanged(bool isLoggedIn); 

bool status = checkLogin(); 
emit loginStatusChanged(status); 

をそしてあなたは、専用のスロットを持っていなければならないのは、あなたが持っていると言う

:ので、私は少しあなたの例を変更してみましょうSafeOTPWindowにそのようなことやって:

void SafeOTPWindow::UpdateTableAfterLogin(bool isLoggedIn) 
{ 
    ui->tblLog->setColumnHidden(1,isLoggedIn); 
} 

を、あなたはいつものように接続します

connect(&login, SIGNAL(loginStatusChanged()), &w, SLOT(UpdateTableAfterLogin(bool)) ); 
関連する問題