我的QTCreator学习笔记(⼗)——应⽤程序主窗⼝
QMainWindow之富⽂本处理
参考⽂献:《Qt Creator 快速⼊门》第三版 霍亚飞编著
富⽂本(Rich Text)或者叫富⽂本格式,简单来说就是在⽂档中可以使⽤多种格式,⽐如字体颜⾊,图⽚和表格等。它是与纯⽂本(Plain Text)相对⽽⾔的。⽐如记事本就是纯⽂本编辑器,Word就是富⽂本编辑器。
⼀、富⽂本⽂档结构
Qt对富⽂本的处理分为编辑操作和只读操作两种⽅式。编辑操作使⽤基于光标的⼀些接⼝函数,只读操作使⽤基于⽂档框架的⼀些接⼝函数。⽂档的光标主要基于QTextCursor类,⽽⽂档的框架主要基于QTextFrame类。
⼀个富⽂本⽂档的结构分为分为⼏种元素来表⽰,分别是框架(QTextFrame)、⽂本块(QTextBlock)、表格(QTextTable)和列表(QTextList)。每种元素的格式⼜使⽤相应的format类来表⽰,分别是QTextFrameFormat、QTextBlockFormat、QTextTableFormat和QTextListFormat。
QTextEdit就是⼀个富⽂本编辑器,在构建QTextEdit对象时就已经构建了⼀个QTextDocument类对象和⼀个QTextCursor对象,只需要使⽤他们进⾏相应操作即可。
新建Qt Widgets应⽤,项⽬名为myrichtext,类名默认MainWindow,基类默认QMainWIndow。在设计模式向拖⼊⼀个TextEidt部件。然后到mainwindow。cpp⽂件中,在构造函数中添加以下代码
QTextDocument* document=ui->textEdit->document();//获取⽂档对象
QTextFrame* rootFrame=document->rootFrame();//获取跟框架
QTextFrameFormat format;//创建框架格式
format.setBorderBrush(Qt::red);//边界颜⾊
format.setBorder(3);
text align centerrootFrame->setFrameFormat(format);//使⽤框架格式
运⾏效果如下,
继续添加下⾯代码,使⽤光标类对象,在框架中添加⼀个⼦框架
QTextFrameFormat frameFormat;
frameFormat.setBackground(Qt::lightGray);//设置背景颜⾊
frameFormat.setMargin(10);//设置边距
frameFormat.setPadding(5);//设置填衬
frameFormat.setBorder(2);//设置边框
frameFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted);//设置边框样式
QTextCursor cursor=ui->textEdit->textCursor();//获取光标
cursor.insertFrame(frameFormat);//在光标处插⼊框架
运⾏效果如下
⼆、⽂本块
⽂本块QTextBlock类为⽂本⽂档QTextDocument提供了⼀个⽂本⽚段(QTextFragment)的容器。⽂本
块的格式由QTextBlockFormat 类来处理,主要涉及对齐⽅式、四周边距、缩进等,⽽⽂本内容的格式由QTextCharFormat来设置,主要涉及字体⼤⼩、下划线、加粗等。
在mainwindow.h中添加私有槽声明
private slots:
void setTextFont(bool checked);
在mainwindow.cpp中添加以下代码
QAction* action_font=new QAction(QObject::tr("字体"),this);
action_font->setCheckable(true);
connect(action_font,&QAction::toggled,this,&MainWindow::setTextFont);
ui->mainToolBar->addAction(action_font);
最后在槽函数 setTextFont实现中,使⽤QTextBlockFormat和QTextCharFormat设置格式,代码如下
void MainWindow::setTextFont(bool checked)//设置字体格式
{
if(checked)
{
QTextCursor cursor=ui->textEdit->textCursor();
QTextBlockFormat blockFormat;//⽂本块格式
blockFormat.setAlignment(Qt::AlignCenter);//⽔平居中
cursor.insertBlock(blockFormat);//使⽤⽂本块格式
QTextCharFormat charFormat;//字符格式
charFormat.setBackground(Qt::lightGray);//设置背景⾊
charFormat.setForeground(Qt::blue);//设置字体颜⾊
//使⽤宋体12号,加粗倾斜
charFormat.setFont(QFont(QObject::tr("宋体"),12,QFont::Bold,true));
charFormat.setFontUnderline(true);//使⽤下划线
cursor.setCharFormat(charFormat);//使⽤字体格式
cursor.insertText(QObject::tr("测试字体"));
}
else
{
}
}
运⾏效果如下
三、表格、列表与图⽚
直接上代码,在mainwindow.h中添加私有槽声明
private slots:
void insertTable();//插⼊表格
void insertList();//插⼊列表
void insertImage();//插⼊图⽚
在mainwindow.cpp⽂件的构造函数中创建3个动作并添加到⼯具栏中,将动作的点击与槽函数绑定,代码如下
QAction* action_textTable=new QAction(QObject::tr("表格"),this);
QAction* action_textList=new QAction(QObject::tr("列表"),this);
QAction* action_textImage=new QAction(QObject::tr("图⽚"),this);
connect(action_textTable,&QAction::triggered,this,&MainWindow::insertTable);
connect(action_textList,&QAction::triggered,this,&MainWindow::insertList);
connect(action_textImage,&QAction::triggered,this,&MainWindow::insertImage);
ui->mainToolBar->addAction(action_textTable);
ui->mainToolBar->addAction(action_textList);
ui->mainToolBar->addAction(action_textImage);
实现槽函数如下
void MainWindow::insertTable()
{
QTextCursor cursor=ui->textEdit->textCursor();
QTextTableFormat format;
format.setCellSpacing(2);//表格外边⽩
format.setCellPadding(10);//表格内边⽩
cursor.insertTable(2,2,format);//插⼊两⾏两列表格
}
void MainWindow::insertList()//插⼊列表
{
QTextListFormat format;//列表格式
format.setStyle(QTextListFormat::ListDecimal);//数字编号
ui->textEdit->textCursor().insertList(format);
}
void MainWindow::insertImage()
{
QTextImageFormat format;//图⽚格式
format.setName("D:\logo.png");//图⽚路径
ui->textEdit->textCursor().insertImage(format);
}
有代码可知表格使⽤QTextTableFormat和insetTablle,列表使⽤QTextListFormat和insertList,图⽚使⽤QTextImageFormat和insertImage。
代码运⾏效果如下
四、查功能
查功能由QTextEdit的find函数实现,另外QTextEdit还提供了其他⽅便的函数,如复制、粘贴、撤销、恢复、放⼤、缩⼩等。
下⾯代码使⽤QTextEdit的find函数实现朝朝功能。(另外,也可以使⽤QTextDocument的find函数,功能更强⼤)。
在头⽂件中添加成员变量如下
QLineEdit* lineEdit;
QDialog* findDialog;
继续在头⽂件中添加槽函数声明
void textFind();//查⽂本
void findNext();//查下⼀个
在构造函数中创建查对话框,往⼯具栏添加查动作,代码如下
QAction* action_textFind=new QAction(QObject::tr("查"),this);
connect(action_textFind,&QAction::triggered,this,&MainWindow::textFind);
ui->mainToolBar->addAction(action_textFind);
findDialog=new QDialog(this);//创建对话框
lineEdit=new QLineEdit(findDialog);//创建⾏编辑器
QPushButton* btn=new QPushButton(findDialog);//创建按钮
btn->setText("find next");
connect(btn,&QPushButton::clicked,this,&MainWindow::findNext);
QVBoxLayout* layout=new QVBoxLayout;//创建垂直布局管理器
layout->addWidget(lineEdit);//添加部件
layout->addWidget(btn);
findDialog->setLayout(layout);//在对话框中使⽤布局管理器
实现槽函数,代码如下
void MainWindow::textFind()
{
findDialog->show();
}
void MainWindow::findNext()
{
QString string=lineEdit->text();
//使⽤查函数查指定字符串,查⽅式为向后查
bool isFind=ui->textEdit->find(string);
if(isFind)
{
qDebug()<<"Row:"<<ui->textEdit->textCursor().blockNumber()\
<<",Colum:"<<ui->textEdit->textCursor().columnNumber();
}
}
运⾏效果如下,这⾥要注意,默认从光标位置往后查,要注意光标位置,如果光标已经在最后了,就会查不到

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。