Revision control
Copy as Markdown
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtWidgets>
#include "mainwindow.h"
MainWindow::MainWindow()
{
QMenu *fileMenu = new QMenu(tr("&File"));
QAction *saveAction = fileMenu->addAction(tr("&Save..."));
saveAction->setShortcut(tr("Ctrl+S"));
QAction *quitAction = fileMenu->addAction(tr("E&xit"));
quitAction->setShortcut(tr("Ctrl+Q"));
menuBar()->addMenu(fileMenu);
editor = new QTextEdit;
//! [rootframe]
QTextDocument *editorDocument = editor->document();
QTextFrame *root = editorDocument->rootFrame();
//! [rootframe]
processFrame(root);
QTextCursor cursor(editor->textCursor());
cursor.movePosition(QTextCursor::Start);
QTextFrame *mainFrame = cursor.currentFrame();
QTextCharFormat plainCharFormat;
QTextCharFormat boldCharFormat;
boldCharFormat.setFontWeight(QFont::Bold);
/* main frame
//! [0]
QTextFrame *mainFrame = cursor.currentFrame();
cursor.insertText(...);
//! [0]
*/
cursor.insertText("Text documents are represented by the "
"QTextDocument class, rather than by QString objects. "
"Each QTextDocument object contains information about "
"the document's internal representation, its structure, "
"and keeps track of modifications to provide undo/redo "
"facilities. This approach allows features such as the "
"layout management to be delegated to specialized "
"classes, but also provides a focus for the framework.",
plainCharFormat);
//! [1]
QTextFrameFormat frameFormat;
frameFormat.setMargin(32);
frameFormat.setPadding(8);
frameFormat.setBorder(4);
//! [1]
cursor.insertFrame(frameFormat);
/* insert frame
//! [2]
cursor.insertFrame(frameFormat);
cursor.insertText(...);
//! [2]
*/
cursor.insertText("Documents are either converted from external sources "
"or created from scratch using Qt. The creation process "
"can done by an editor widget, such as QTextEdit, or by "
"explicit calls to the Scribe API.", boldCharFormat);
cursor = mainFrame->lastCursorPosition();
/* last cursor
//! [3]
cursor = mainFrame->lastCursorPosition();
cursor.insertText(...);
//! [3]
*/
cursor.insertText("There are two complementary ways to visualize the "
"contents of a document: as a linear buffer that is "
"used by editors to modify the contents, and as an "
"object hierarchy containing structural information "
"that is useful to layout engines. In the hierarchical "
"model, the objects generally correspond to visual "
"elements such as frames, tables, and lists. At a lower "
"level, these elements describe properties such as the "
"style of text used and its alignment. The linear "
"representation of the document is used for editing and "
"manipulation of the document's contents.",
plainCharFormat);
connect(saveAction, &QAction::triggered, this, &MainWindow::saveFile);
connect(quitAction, &QAction::triggered, this, &MainWindow::close);
setCentralWidget(editor);
setWindowTitle(tr("Text Document Frames"));
}
void MainWindow::saveFile()
{
QString fileName = QFileDialog::getSaveFileName(this,
tr("Save document as:"), "", tr("XML (*.xml)"));
if (!fileName.isEmpty()) {
if (writeXml(fileName))
setWindowTitle(fileName);
else
QMessageBox::warning(this, tr("Warning"),
tr("Failed to save the document."), QMessageBox::Cancel,
QMessageBox::NoButton);
}
}
void MainWindow::processBlock(QTextBlock)
{
}
void MainWindow::processFrame(QTextFrame *frame)
{
//! [4]
QTextFrame::iterator it;
for (it = frame->begin(); !(it.atEnd()); ++it) {
QTextFrame *childFrame = it.currentFrame();
QTextBlock childBlock = it.currentBlock();
if (childFrame)
processFrame(childFrame);
else if (childBlock.isValid())
processBlock(childBlock);
}
//! [4]
}