2015-11-26 54 views
-2

我想調用一個使用Qt信號插槽機制的類的方法。 例如:使用信號插槽的qt類的調用方法

QJsonObject routerInfo; 
class LinksysE3000 : public QObject{ 
    Q_OBJECT 
public: 
    LinksysE3000(){ 
     view = new QWebView; 
     view->load(QUrl("http://admin:[email protected]")); 
     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()函數?

我想提醒的是主GETALL()功能或其他任何類,它是類實例化LinksysE3000。可能嗎?如果沒有..是否有任何其他機制來加載網頁和提取字段值..?

有人能幫我解決這個問題嗎?

如果我用這個代碼,我得到什麼:

class LinksysE3000 : public QObject{ 
    Q_OBJECT 
    public: 
    LinksysE3000(){ 
     view = new QWebView; 
     view->load(QUrl("http://admin:[email protected]")); 
     //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

呃,'LinksysE3000.getAll();'? – thirtythreeforty

+0

如果您切換評論,會發生什麼情況?你試過了嗎? – skypjack

+0

亞..是否有可能..? –

回答

0

當然可以。您可以像使用其他方法一樣調用帶有信號和插槽的對象的方法。你爲什麼不試試呢? 您也可以像普通的類方法(如果它們不是私有的)調用槽。

而且順便說一句,你真的不應該命名您的對象酷似類

LinksysE3000 LinksysE3000; 

,你可以在語法高亮看,它是完全一樣的困惑,因爲每個人的閱讀是從我自己的經驗,我可以告訴你,做任何自動重命名或任何發現替換動作真的會變得一團糟。

+0

好吧..信號生成後才返回app.exec();主要。那麼我怎樣才能調用函數.. –

+0

您的finishedLoading()槽在Qt的內部主循環期間執行,它隱藏在'QApplication :: exec()'後面。因此,在調用'app.exec()'之前,您的數據不可用。您必須設計您的應用程序,以便您可以使用Qt主循環執行所有應用程序邏輯。 –

+0

你知道如何與Qt主循環交互嗎? –