使用信号槽

时间:2015-11-26 07:15:31

标签: c++ qt

我想调用一个使用Qt Signal Slot机制的类的方法。 例如:

QJsonObject routerInfo;
class LinksysE3000 : public QObject{
    Q_OBJECT
public:
    LinksysE3000(){
        view = new QWebView;
        view->load(QUrl("http://admin:admin@192.168.1.1"));
        connect(view,       SIGNAL(loadFinished(bool)),this,SLOT(finishedLoading(bool)));
        //view->show();
    }
    ~LinksysE3000()
    {
        view->close();
    }
    QJsonObject getStatus_RouterDetails(QWebFrame*);
    QJsonObject getAll();
public slots:
    void finishedLoading(bool ok);

private:
    QWebView *view;
};

void LinksysE3000::finishedLoading(bool ok)
{
        mainFrame = view->page()->mainFrame();
        routerInfo = getStatus_RouterDetails(mainFrame);
}
QJsonObject LinksysE3000::getAll()
{
return routerInfo;
}
#include "main.moc"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    LinksysE3000 LinksysE3000;
    // LinksysE3000.getAll();
    return app.exec();
}

这是我使用的代码。在这里,我加载了一个网页,并使用信号槽机制获取一些数据。

此处仅在完成的执行后生成信号 loadFinished 。我怎样才能调用getAll()函数?

我想从main或任何其他实例化类 LinksysE3000 的类中调用 getAll()函数。可能吗?如果没有..是否有任何其他机制来加载网页并提取字段值..?

有人可以帮我解决这个问题......?

如果我使用此代码,我什么都得不到:

class LinksysE3000 : public QObject{
   Q_OBJECT
    public:
    LinksysE3000(){
        view = new QWebView;
        view->load(QUrl("http://admin:admin@192.168.1.1"));
        //connect(view, SIGNAL(loadFinished(bool)),this,SLOT(finishedLoading(bool)));
        //view->show();
    }
     ~LinksysE3000()
   {
        view->close();
   }


   QJsonObject getStatus_RouterDetails(QWebFrame*);
   QJsonObject getAll();
   QWebView *view;
   QWebFrame *mainFrame;
   QString clickedPage;
   public slots:
   void finishedLoading(bool ok);

   private:

   };

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

   QApplication app(argc, argv);
  LinksysE3000 linksysE3000;
  QThread::sleep(3);
  QWebFrame *frame = linksysE3000.view->page()->mainFrame();
  qDebug()<<frame->toPlainText(); //This returns nothing
  QJsonObject obj = linksysE3000.getStatus_RouterDetails(frame);
  qDebug()<<obj;  //This shulod return key value pairs, but retuns empty values means page not loaded

  return app.exec();

  }

1 个答案:

答案 0 :(得分:0)

当然可以。您可以像使用其他方法一样调用带有信号和槽的对象上的方法。你为什么不试试呢? 您也可以像普通类方法一样调用插槽(如果它们不是私有的)。

顺便说一句,你真的不应该像你的班级一样命名你的对象

LinksysE3000 LinksysE3000;
正如您在语法突出显示中所看到的那样,它完全像每个人类读者一样困惑,根据我自己的经验,我可以告诉您,进行任何自动重命名或任何查找&amp;替换行动真的搞得一团糟。