Сигналы и слоты

Я написал некоторый код, где, если я войду в систему как клиент, он должен скрыть столбец customer (значение этого столбца равно 1). Мне нужно передать параметр сигналам. Я использовал свой customerLogin является 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 ответ

Решение

Для примера слот / сигнал вам необходимо соединить два объекта с одинаковыми параметрами. Итак, позвольте мне немного изменить ваш пример:

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

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))  );
Другие вопросы по тегам