Пример "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);
}
Определение класса 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->setShortcut(tr("Ctrl+O"));
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:
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 = new MainWindow;
mainWindow->show();
return app.exec();
}
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|