【问题标题】:Signals and Slots信号和插槽
【发布时间】:2017-01-31 06:28:40
【问题描述】:

我编写了一些代码,如果我以客户身份登录,它应该隐藏列 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);
   }

【问题讨论】:

  • 您是否尝试过阅读有关信号和插槽的 Qt 文档?他们有一个简单的Counter 类,当它的值改变时会发出一个信号——并且信号具有新的值。 doc.qt.io/qt-5/signalsandslots.html
  • 我试过了但是我很困惑如何在上面的例子中使用它
  • 我建议删除您的第二个示例,只解决一个问题。找到解决方案后,您应该能够自己解决第二个问题

标签: c++ qt signals-slots


【解决方案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))  );

【讨论】:

    猜你喜欢
    • 2012-07-13
    • 2013-02-02
    • 1970-01-01
    • 2019-04-20
    • 2013-11-13
    • 2012-10-15
    • 2015-07-18
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多