【发布时间】: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 类,即当我直接调用它时,它会起作用:)