The code demonstrates how the Qt application can communicate with the embedded ActiveX controls using signals, slots and the dynamicCall() function.
class MainWindow : public QMainWindow, public Ui::MainWindow { Q_OBJECT public: MainWindow(); public slots: void on_WebBrowser_TitleChange(const QString &title); void on_WebBrowser_ProgressChange(int a, int b); void on_WebBrowser_CommandStateChange(int cmd, bool on); void on_WebBrowser_BeforeNavigate(); void on_WebBrowser_NavigateComplete(QString); void on_actionGo_triggered(); void on_actionNewWindow_triggered(); void on_actionAbout_triggered(); void on_actionAboutQt_triggered(); void on_actionFileClose_triggered(); private: QProgressBar *pb; QLineEdit *addressEdit; };
The
MainWindow
类声明
QMainWindow
基用户界面,使用
Ui::MainWindow
class generated by Qt Designer. A number of slots are implemented to handle events from the various user interface elements, including the
WebBrowser
object, which is a
QAxWidget
hosting the Microsoft Web Browser control.
MainWindow::MainWindow() { setupUi(this); addressEdit = new QLineEdit; tbAddress->insertWidget(actionGo, new QLabel(tr("Address"))); tbAddress->insertWidget(actionGo, addressEdit); connect(addressEdit, SIGNAL(returnPressed()), actionGo, SLOT(trigger())); connect(actionBack, SIGNAL(triggered()), WebBrowser, SLOT(GoBack())); connect(actionForward, SIGNAL(triggered()), WebBrowser, SLOT(GoForward())); connect(actionStop, SIGNAL(triggered()), WebBrowser, SLOT(Stop())); connect(actionRefresh, SIGNAL(triggered()), WebBrowser, SLOT(Refresh())); connect(actionHome, SIGNAL(triggered()), WebBrowser, SLOT(GoHome())); connect(actionSearch, SIGNAL(triggered()), WebBrowser, SLOT(GoSearch())); pb = new QProgressBar(statusBar()); pb->setTextVisible(false); pb->hide(); statusBar()->addPermanentWidget(pb); WebBrowser->dynamicCall("GoHome()"); }
The constructor initializes the user interface, installs a progress bar on the status bar, and uses
QAxBase::dynamicCall
() to invoke the
GoHome()
method of Internet Explorer to navigate to the user's home page.
void MainWindow::on_WebBrowser_TitleChange(const QString &title) { setWindowTitle("Qt WebBrowser - " + title); } void MainWindow::on_WebBrowser_ProgressChange(int a, int b) { if (a <= 0 || b <= 0) { pb->hide(); return; } pb->show(); pb->setRange(0, b); pb->setValue(a); } void MainWindow::on_WebBrowser_CommandStateChange(int cmd, bool on) { switch (cmd) { case 1: actionForward->setEnabled(on); break; case 2: actionBack->setEnabled(on); break; } } void MainWindow::on_WebBrowser_BeforeNavigate() { actionStop->setEnabled(true); } void MainWindow::on_WebBrowser_NavigateComplete(QString) { actionStop->setEnabled(false); }
Different slots handle the signals emitted by the WebBrowser object.
Connections that don't require any coding, i.e. connecting the
back
action to the
GoBack()
slot, have already been made in Qt Designer.
void MainWindow::on_actionGo_triggered() { WebBrowser->dynamicCall("Navigate(const QString&)", addressEdit->text()); } void MainWindow::on_actionNewWindow_triggered() { MainWindow *window = new MainWindow; window->show(); if (addressEdit->text().isEmpty()) return; window->addressEdit->setText(addressEdit->text()); window->actionStop->setEnabled(true); window->on_actionGo_triggered(); } void MainWindow::on_actionAbout_triggered() { QMessageBox::about(this, tr("About WebBrowser"), tr("This Example has been created using the ActiveQt integration into Qt Designer.\n" "It demonstrates the use of QAxWidget to embed the Internet Explorer ActiveX\n" "control into a Qt application.")); } void MainWindow::on_actionAboutQt_triggered() { QMessageBox::aboutQt(this, tr("About Qt")); } void MainWindow::on_actionFileClose_triggered() { close(); } #include "main.moc" int main(int argc, char ** argv) { QApplication a(argc, argv); MainWindow w; #if defined(Q_OS_WINCE) w.showMaximized(); #else w.show(); #endif return a.exec(); }
The rest of the implementation is not related to ActiveQt - the actions are handled by different slots, and the entry point function starts the application using standard Qt APIs.
要构建范例必须先构建
QAxContainer
库。然后运行 make 工具在
examples/activeqt/webbrowser
和运行结果
webbrowser.exe
.
文件: