123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 | // 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 =newQMenu(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"));}voidMainWindow::saveFile(){ QString fileName =QFileDialog::getSaveFileName(this,tr("Save document as:"),"",tr("XML (*.xml)"));if(!fileName.isEmpty()) {if(writeXml(fileName))setWindowTitle(fileName);elseQMessageBox::warning(this,tr("Warning"),tr("Failed to save the document."),QMessageBox::Cancel,QMessageBox::NoButton);}}voidMainWindow::processBlock(QTextBlock){}voidMainWindow::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]}
|