Пример "Previewer"Файлы:
Пример "Previewer" показывает, как использовать QtWebKit'а, QWebView, для предварительного просмотра HTML данных, записанных в QPlainTextEdit. Пользовательский интерфейсПрежде чем начнём, создадим пользовательский интерфейс используя Qt Designer. Два объекта QGroupBox - групповая рамка редактора и групповая рамка предварительного просмотрщика разделены QSplitter. В групповой рамке редактора находится объект класса QPlainTextEdit - plainTextEdit - и два объекта QPushButton. В групповой рамке предварительного просмотрщика находится объект класса QWebView, webView. Определение класса PreviewerКласс Previewer является подклассом и QWidget, и Ui::Form. Создаём подкласс Ui::Form для того, чтобы встроить созданную ранее в Qt Designer форму пользовательского интерфейса. Этот метод встроенных форм известен как подход множественного наследования. В нашем файле previewer.h имеется конструктор и слот on_previewButton_clicked(). class Previewer : public QWidget, public Ui::Form { Q_OBJECT public: Previewer(QWidget *parent = 0); void setBaseUrl(const QUrl &url); public slots: void on_previewButton_clicked(); private: QUrl baseUrl; }; Реализация класса PreviewerКонструктор Previewer'а отвечает только за настройку пользовательского интерфейса. Previewer::Previewer(QWidget *parent) : QWidget(parent) { setupUi(this); } on_previewButton_clicked() - слот, соответствующий сигналу previewButton'а, clicked(). Когда previewButton нажат, мы извлекаем содержимое plainTextEdit и затем вызываем функцию setHtml() для отображения содержимого в виде HTML. void Previewer::on_previewButton_clicked() { // Обновляем содержимое в просмотрщике веб QString text = plainTextEdit->toPlainText(); webView->setHtml(text, baseUrl); // Изменяем вкладку на мобильных устройствах #if defined Q_OS_SYMBIAN || defined Q_WS_HILDON || defined Q_WS_MAEMO_5 || defined Q_WS_SIMULATOR tabWidget->setCurrentWidget(tabHTMLPreview); #endif } Определение класса MainWindowКласс MainWindow примера "Previewer" является подклассом QMainWindow с конструктором и пятью закрытыми слотами: open(), openUrl(), save(), about() и updateTextEdit(). class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); private slots: void open(); void openUrl(); void save(); void about(); void updateTextEdit(); Закрытые объекты в MainWindow - centralWidget, которыми являются объекты Previewer, fileMenu, helpMenu и объекты QAction - openAct, openUrlAct, saveAct, exitAct, aboutAct и aboutQtAct. private: Previewer *centralWidget; QMenu *fileMenu; QMenu *helpMenu; QAction *openAct; QAction *openUrlAct; QAction *saveAct; QAction *exitAct; QAction *aboutAct; QAction *aboutQtAct; void createActions(); void createMenus(); void setStartupText(); }; Имеется три зарытых функций: createActions(), createMenus() и setStartupText(). Функции createActions() и createMenus() необходимы для установки действий главного окна и установки их для меню File и Help. С другой стороны, функция setStartupText() отображает описание примера в его окне Предварительного просмотра HTML. Реализация класса MainWindowКонструктор MainWindow'а вызывает createActions() и createMenus() для устновки меню File и Help. Далее, объект Previewer, centralWidget, устанавливается на центральный виджет главного окна. Кроме того, мы соединяем сигнал webView'а, loadFinished(), с нашим слотом updateTextEdit(). В заключение, вызываем функцию setStartupText() для отображения описания примера. MainWindow::MainWindow() { createActions(); createMenus(); centralWidget = new Previewer(this); setCentralWidget(centralWidget); connect(centralWidget->webView, SIGNAL(loadFinished(bool)), this, SLOT(updateTextEdit())); setStartupText(); } Внутри функции createActions(), мы создаём экземпляры наших закрытых объектов QAction, которые объявлены в mainwindow.h. Устанавливаем "быстрые" клавиши и текст панели состояния для этих действий и соединяем их сигналы triggered() с соответствующими слотами. void MainWindow::createActions() { openAct = new QAction(tr("&Open..."), this); openAct->setShortcuts(QKeySequence::Open); openAct->setStatusTip(tr("Open an existing HTML file")); connect(openAct, SIGNAL(triggered()), this, SLOT(open())); openUrlAct = new QAction(tr("&Open URL..."), this); openUrlAct->setShortcut(tr("Ctrl+U")); openUrlAct->setStatusTip(tr("Open a URL")); connect(openUrlAct, SIGNAL(triggered()), this, SLOT(openUrl())); ... Функция createMenus() создаёт экземпляр объекто пунктов QMenu, fileMenu и helpMenu и добавляет их в панель меню главного окна. void MainWindow::createMenus() { fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(openAct); fileMenu->addAction(openUrlAct); fileMenu->addAction(saveAct); fileMenu->addSeparator(); fileMenu->addAction(exitAct); menuBar()->addSeparator(); helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(aboutAct); helpMenu->addAction(aboutQtAct); } Пример также предоставляет слот about() для описания своего назначения. void MainWindow::about() { QMessageBox::about(this, tr("About Previewer"), tr("The <b>Previewer</b> example demonstrates how to " "view HTML documents using a QWebView.")); } Класс MainWindow предоставляет два типа функций Open: open() и openUrl(). Функция open() открывает файл HTML с именем fileName и читает его с помощью QTextStream. Затем функция выводит стандартный вывод в plainTextEdit. Имя файл получают, используя функцию QFileDialog'а, getOpenFileName(). void MainWindow::open() { QString fileName = QFileDialog::getOpenFileName(this); if (!fileName.isEmpty()) { // читаем из файла QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::information(this, tr("Unable to open file"), file.errorString()); return; } QTextStream out(&file); QString output = out.readAll(); // отображаем содержимое centralWidget->plainTextEdit->setPlainText(output); centralWidget->setBaseUrl(QUrl::fromLocalFile(fileName)); } } С другой стороны, функция openUrl() отображает QInputDialog для получения URL, и выводит его в webView. void MainWindow::openUrl() { bool ok; QString url = QInputDialog::getText(this, tr("Enter a URL"), tr("URL:"), QLineEdit::Normal, "http://", &ok); if (ok && !url.isEmpty()) { centralWidget->webView->setUrl(url); } } Чтобы записать HTML файл, функция save() сначала извлекает содержимое plainTextEdit и отображает QFileDialog для получения имени файла fileName. Далее, используем объект класса QTextStream, in, для записи в файл file. void MainWindow::save() { QString content = centralWidget->plainTextEdit->toPlainText(); QString fileName = QFileDialog::getSaveFileName(this); if (!fileName.isEmpty()) { // сохраняем в файл QFile file(fileName); if (!file.open(QIODevice::WriteOnly)) { QMessageBox::information(this, tr("Unable to open file"), file.errorString()); return; } QTextStream in(&file); in << content; } } Ранее, в конструкторе MainWindow, мы соединили сигнал webView'а, loadFinished(), с закрытым слотом updateTextEdit(). Этот слот обновляет содержимое plainTextEdit с источником HTML главного фрейма веб-страницы, получаемое используя функцию QWebFrame'а, toHtml(). void MainWindow::updateTextEdit() { QWebFrame *mainFrame = centralWidget->webView->page()->mainFrame(); QString frameText = mainFrame->toHtml(); centralWidget->plainTextEdit->setPlainText(frameText); } Чтобы предоставить описание примера "Previewer" при его запуске, мы используем функцию setStartupText() как показано ниже: void MainWindow::setStartupText() { QString string = "<html><body><h1>HTML Previewer</h1>" " <p>This example shows you how to use QWebView to" " preview HTML data written in a QPlainTextEdit.</p>" " </body></html>"; centralWidget->webView->setHtml(string); } Функция main()Функция main() создаёт объект класса MainWindow, mainWindow, и отображает его с помощью функции show(). int main(int argc, char * argv[]) { QApplication app(argc, argv); MainWindow mainWindow; #if defined Q_OS_SYMBIAN || defined Q_WS_HILDON || defined Q_WS_MAEMO_5 || defined Q_WS_SIMULATOR mainWindow.showMaximized(); #else mainWindow.show(); #endif return app.exec(); } |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |