Qt QAxWidget - WebBrowser手动设置插槽/信号

时间:2014-07-15 01:54:09

标签: c++ qt signals qt5 slot

我已经研究了所有ActiveX Qt示例,但我无法弄清楚如何手动连接Web浏览器的信号和插槽。 (我手动创建所有小部件,因为我的经验认为从长远来看它实际上不那么痛苦,因为当GUI变得非常复杂时,GUI编辑倾向于背叛你:))。

在Qt的QAxWidget / WebBrowser示例中,所有内容似乎都通过一些魔法连接,所有信号/插槽都可以工作。

虽然我在C ++方面很有经验,但我对Qt很新,虽然我的其他信号也有效(比如QPushButton等的clicked()),但我不知道如何调用这个:))

我还要注意导航工作(webBrowser _-> Navigate(...)在另一个文件中调用),但我无法使事件生效。

我基本上得到了一大堆#34;没有这样的信号"警告:

....

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给出了与WebBrowser相关的所有信号/插槽的错误:)

以下是代码:

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

/// 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在64位机器上是5.3 32位版本,Windows是8.1,如果它有任何区别:)

谢谢!

独山

2 个答案:

答案 0 :(得分:1)

来自Qt 5.6 QAxWidget documentation

警告:您可以继承QAxWidget,但不能在子类中使用Q_OBJECT宏(生成的moc文件将无法编译),因此您无法添加更多信号,插槽或属性。此限制是由于在运行时生成的元对象信息。要解决此问题,请将QAxWidget聚合为QObject子类的成员。

答案 1 :(得分:0)

如果要设置信号/插槽机制,则必须在头文件中声明信号和插槽。如果你有强大的C ++背景,我很确定这对你来说并不意外。

所以你的头文件必须是:

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;
};

要发出信号,您只需写下:

emit(NavigateComplete(myString));

代码中的某处,您的广告位将被调用。