2017-01-31 5 views
-4

Я написал код, где, если я вхожу в систему как клиент, он должен скрыть столбец customer (значение этого столбца равно 1). Мне нужно передать параметр сигналам. Я использовал мой customerLogin is isSa. Как передать эти параметры сигналам и слотам?Сигналы и слоты

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

Я рекомендую удалить второй пример и придерживаться только одной проблемы. Если у вас есть решение для этого, вы должны сами решить вторую проблему – Tas

ответ

0

Для слот/сигнал, вам нужно t o соединить два объекта с одинаковыми параметрами. поэтому позвольте мне изменить чуток ваш пример:

Допустим, у вас есть:

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