我已经研究了所有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,如果它有任何区别:)
谢谢!
独山
答案 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));
代码中的某处,您的广告位将被调用。