2014-07-15 1 views
2

모든 ActiveX Qt 예제를 연구했으며 웹 브라우저의 신호와 슬롯을 수동으로 연결하는 방법을 알지 못했습니다. (GUI 편집기가 GUI가 실제로 복잡해지면 당신을 배신하는 경향이 있기 때문에, 내 경험에 의하면 실제로 장기적으로 고통스럽지 않다고 생각했기 때문에 모든 위젯을 수동으로 생성합니다.)).Qt QAxWidget - 수동으로 슬롯/신호를 설정하는 웹 브라우저

Qt의 QAxWidget/WebBrowser 예에서 모든 것이 약간의 마술로 연결되어있는 것으로 보이며 모든 신호/슬롯이 작동합니다. 나는 꽤 C++에서 경험하고 있지만

, 나는 Qt는에 아주 새로운 오전, 나의 다른 신호 작동하지만 (클릭 (같은) QPushButton을 등을 위해),이 하나 :))

를 호출하는 방법을 잘 모르겠습니다

네비게이션하기 작업 (webBrowser _-> Navigate (...)이 다른 파일에서 호출 됨)에도 불구하고 작동하는 이벤트를 얻을 수 없다는 점에 유의하고 싶습니다.

나는 기본적으로 그 "그런 신호"경고의 무리 얻을 : 기본적으로

.... 

QObject::connect: No such signal mis::WebAxBrowser::NavigateComplete(QString) in WebAxBrowser.cpp:14 
.... 
QObject::receivers: No such signal mis::WebAxBrowser::DownloadComplete() 
QObject::receivers: No such signal mis::WebAxBrowser::DownloadComplete() 
QObject::receivers: No such signal mis::WebAxBrowser::StatusTextChange(QString) 
QObject::receivers: No such signal mis::WebAxBrowser::StatusTextChange(QString) 
QObject::receivers: No such signal mis::WebAxBrowser::StatusTextChange(QString) 
QObject::receivers: No such signal mis::WebAxBrowser::StatusTextChange(QString) 
QObject::receivers: No such signal mis::WebAxBrowser::DownloadBegin() 
QObject::receivers: No such signal mis::WebAxBrowser::DownloadBegin() 
QObject::receivers: No such signal mis::WebAxBrowser::SetSecureLockIcon(int) 
QObject::receivers: No such signal mis::WebAxBrowser::SetSecureLockIcon(int) 
QObject::receivers: No such signal mis::WebAxBrowser::StatusTextChange(QString) 
QObject::receivers: No such signal mis::WebAxBrowser::StatusTextChange(QString) 
QObject::receivers: No such signal mis::WebAxBrowser::CommandStateChange(int,bool) 
QObject::receivers: No such signal mis::WebAxBrowser::CommandStateChange(int,bool) 
.... 

을, Qt는이 웹 브라우저 : 여기

관련 나를 모든 신호에 대한 오류/슬롯을 제공하는 코드는 다음과 같습니다

/////////////////////////////////////////////////////////////////////////////// ///

/// Header File: 

namespace mis 
{ 

class WebAxBrowser : public QAxWidget 
{ 
    Q_OBJECT 

    public: 


    WebAxBrowser(QWidget* parent = 0, Qt::WindowFlags f = 0); 
    virtual ~WebAxBrowser(); 

    public slots: 

    void onNavigateComplete(QString url); 

    protected: 

    virtual bool translateKeyEvent(int message, int keycode) const; 
}; 

} //namespace 


//// Source File: 


namespace mis 
{ 

const QString INTERNET_EXPLORER_ACTIVE_X_UNIQUE_INDENTIFIER = "{8856F961-340A-11D0-A96B-00C04FD705A2}"; 

WebAxBrowser::WebAxBrowser(QWidget* parent, Qt::WindowFlags f) : QAxWidget(parent, f) 
{ 
    this->setControl(INTERNET_EXPLORER_ACTIVE_X_UNIQUE_INDENTIFIER); 

    connect(this, 
    SIGNAL(NavigateComplete(QString)), 
    this, SLOT(onNavigateComplete(QString))); //Am I missing something???? 




} 


WebAxBrowser::~WebAxBrowser() 
{ 
} 

bool WebAxBrowser::translateKeyEvent(int message, int keycode) const 
{ 
    if (message >= WM_KEYFIRST && message <= WM_KEYLAST) 
    { 
     return true; 
    }   
    else 
    { 
     return QAxWidget::translateKeyEvent(message, keycode); 
    } 

} 

void WebAxBrowser::onNavigateComplete(QString url) 
{ 
    ///Never gets called , what am I missing? :) 
    QMessageBox::information(this, "Never geets called :(", url); 
} 


} 

/// 코드 끝

Visual C++ 2013 Qt Addon을 사용합니다. Qt는 64bit 컴퓨터에서 5.3 32bit 버전이고, Windows가 8.1이면 차이가 있습니다.

고마워요! Dushan

+0

이상하게도 QAxWidget 클래스를 서브 클래 싱하지 않으면 즉, 직접 호출 할 때 작동합니다. –

답변

0

는 신호/슬롯 mecanism을 설정하려는

, 당신은 당신의 헤더 파일에 신호와 슬롯을 선언해야합니다. C++ 배경이 강한 사람이라면 놀라지 않을 것입니다.

그래서 헤더 파일이 무언가 같이해야합니다 : 코드에서 어딘가에

emit(NavigateComplete(myString)); 

를하고 슬롯 호출됩니다 :

class WebAxBrowser : public QAxWidget 
{ 
    Q_OBJECT 

    public: 
     WebAxBrowser(QWidget* parent = 0, Qt::WindowFlags f = 0); 
     virtual ~WebAxBrowser(); 

    signals: 
     void NavigateComplete(QString); 

    public slots: 
     void onNavigateComplete(QString url); 

    protected: 

    virtual bool translateKeyEvent(int message, int keycode) const; 
}; 

가 신호를 방출하기 위해, 당신은 단지 작성해야합니다. 에서

+0

탐색이 완료되면 어떻게 알 수 있습니까? 해당 신호를 QAxWidget (ActiveX) 구성 요소에서 내 보내지 않아야합니까? :) 또한 QAxWidget 클래스를 직접 사용할 때이 함수가 작동하는 이유는 무엇입니까? 내 질문에 대해 다시 말해야합니까?:) 신호가 작동하는 방식을 꽤 많이 알고 있습니다. QAxWidget을 정의 할 때 QAxWidget의 정의 된 신호가 왜 작동하지 않는지 궁금합니다. –

+0

내비게이션 완료 시점을 어떻게 알 수 있습니까? 신호'NavigateComplete (QString)'을 내보낼 때마다 슬롯 onNavigateComplete (QString url);을 실행합니다. 당신의 두 번째 질문에 대해, 왜 내가 찾으면, 나는 당신에게 말할 것입니다;) – Martin

1

Qt 5.6 QAxWidget documentation :

경고 : 당신은 QAxWidget를 서브 클래스화할 수 있습니다 만, 추가 신호, 슬롯 또는 속성을 추가 할 수 있도록, 서브 클래스 (생성 된 MOC-파일이 컴파일되지 않습니다)에서 Q_OBJECT 매크로를 사용할 수 없습니다 . 이 한계는 런타임에 생성 된 메타 오브젝트 정보로 인한 것입니다. 이 문제를 해결하려면 QAxWidget을 QObject 하위 클래스의 멤버로 집계하십시오.