【问题标题】:Qt QAxWidget - WebBrowser setting slots/signals manuallyQt QAxWidget - WebBrowser 手动设置插槽/信号
【发布时间】:2014-09-05 02:09:06
【问题描述】:

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

在 Qt 的 QAxWidget / WebBrowser 示例中,一切似乎都通过某种魔法连接起来,并且所有信号/插槽都工作。

虽然我在 C++ 方面非常有经验,但我对 Qt 还是很陌生,虽然我的其他信号有效(例如 QPushButton 的 clicked() 等),但我不知道如何调用这个 :))

我还想指出,导航工作( 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 给我与 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 插件。 Qt是64位机器上的5.3 32位版本,Windows是8.1,如果有什么不同的话:)

谢谢!

独山

【问题讨论】:

  • 另外,奇怪的是,如果我不继承 QAxWidget 类,即当我直接调用它时,它会起作用:)

标签: c++ qt signals qt5 slot


【解决方案1】:

当您想设置信号/槽机制时,您必须在头文件中声明您的信号和槽。如果你有很强的 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));

在您的代码中的某处,您的插槽将被调用。

【讨论】:

  • 但是我怎么知道导航什么时候完成呢?该信号不应该由 QAxWidget (ActiveX) 组件发出吗? :) 另外,为什么当我直接使用 QAxWidget 类而不是子类时它会起作用?我应该改写我的问题吗? :) 我几乎知道信号是如何工作的,我只是想知道为什么 Qt QAxWidget 中定义的一些信号在你继承 QAxWidget 时不起作用
  • 我真的不明白您如何知道导航何时完成的问题。每次发出信号NavigateComplete(QString) 时,都会启动插槽onNavigateComplete(QString url);。关于你的第二个问题,如果我找到原因,我会告诉你;)
【解决方案2】:

来自Qt 5.6 QAxWidget documentation

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2012-10-15
    • 2015-07-18
    • 2011-09-06
    • 2013-09-27
    相关资源
    最近更新 更多