Qt学习之路之文本编辑

Qt里面,任何一个文本编辑的程序都要用到类QTextEdit作为输入文本的容器,

在这个里可编辑的文本由QTextDocument作为载体,用来QTextDocument的元素的

QTextBlockQTextListQTextFrame等是QTextDocument的不同表现形式。

每个元素都有自己的格式,而关于文本编辑用到的最常用的类是QTextCursor,它

提供了对QTextDocument文档的修改接口,对于文本的修改,都与光标有关。

下面的代码是关于文本编辑的简单示例, 涉及到文本编辑的:

A.设置字体

B.设置字号

C.设置颜色

D.加粗

E.设置颜色

~~~~~~~~~~~~~~~~~~上代码~~~~~~~~~~~~~~~~~~~~~~

file_widget.h

#ifndef FILEWIDGET_H
#define FILEWIDGET_H

#include <QFileDialog>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QHBoxLayout>
#include <QFile>
#include <QIODevice>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QTextStream>
#include <QMessageBox>
#include <QPrintDialog>		
#include <QPrinter>		
#include <QFontComboBox>
#include <QComboBox>
#include <QFontDatabase>
#include <QTextCharFormat>
#include <QTextCursor>
#include <QColorDialog>

class FileWidget : public QWidget
{
	Q_OBJECT
public:
	explicit FileWidget(QWidget *parent = 0);

	void mergeFormat(QTextCharFormat format);
	public slots:
		void slotOpenFileDialog();	//打开打开文件对话框
		void slotPrintText();				//--文本打印新增 --------打印文本文件

		void slotShowFontComboBox(QString comboStr);	//--字库
		void slotShowSizeSpinBox(QString spinValue);
		void slotShowBoldBtn();				//---加粗
		void slotShowUnderlineBtn();		//--下划线
		void slotShowColorBtn();				//--颜色
		void slotShowCurrentFormatChanged(const QTextCharFormat &fmt);		//--设置字符格式

private:
	QPushButton *openBtn;
	QPushButton *printBtn;		//---文本打印按钮
	QPushButton *colorBtn;		//---颜色按钮
	QPushButton *underlineBtn;	//--下划线按钮
	QPushButton *boldBtn;		//--字体加粗按钮

	QFontDatabase fontDataBase;
	QFontComboBox *fontComboBox;	//--字体
	QComboBox *sizeComboBox;		//字号
	QLabel *tipsLabel;
	QLabel *fontLabel;		//字体标签
	QLabel *fontSizeLabel;	//  字号
	QTextEdit *showText;
};

#endif	//FILEWIDGET_H

file_widget.cpp

#include "file_widget.h"

FileWidget::FileWidget(QWidget *parent /*= 0*/) : QWidget(parent)
{
	//----showText
	showText = new QTextEdit();

	//---按钮与label 
	boldBtn = new QPushButton("Bold", this);	//--文本加粗按钮
	boldBtn->setCheckable(true);						//--设置按钮属性的值
	colorBtn = new QPushButton("Color", this);	//--文本颜色按钮
	colorBtn->setCheckable(true);
	underlineBtn = new QPushButton("UnderLine", this);		//-文本下划线按钮
	underlineBtn->setCheckable(true);
	printBtn = new QPushButton("print", this);		//---文本打印新增
	openBtn = new QPushButton("OPEN", this);		//---打开文件按钮
	fontComboBox = new QFontComboBox();		//--字体
	fontComboBox->setFixedSize(70,30);
	sizeComboBox = new QComboBox;			//---字号
	sizeComboBox->setFixedSize(70,30);
	fontLabel = new QLabel("font", this);			//--字体label
	fontSizeLabel = new QLabel("Size", this);		//--字号label

	//---设置字号
	foreach(int size, fontDataBase.standardSizes())
	{
		sizeComboBox->addItem(QString :: number(size));
	}
	//----设置信号与槽
	connect(fontComboBox, SIGNAL(activated(QString)), 
				this, SLOT(slotShowFontComboBox(QString)));		// ---字库
	connect(sizeComboBox, SIGNAL(activated(QString)),	
				this,  SLOT(slotShowSizeSpinBox(QString)));			//--字号
	connect(boldBtn, SIGNAL(clicked()), this, SLOT(slotShowBoldBtn()));			//--加粗
	connect(colorBtn, SIGNAL(clicked()), this, SLOT(slotShowColorBtn()));			//--颜色
	connect(underlineBtn, SIGNAL(clicked()), this, SLOT(slotShowUnderlineBtn()));	//--下划线

	connect(showText, SIGNAL(currentCharFormatChanged(const QTextCharFormat )), 
		this, 
		SLOT(slotShowCurrentFormatChanged(const QTextCharFormat &fmt)));

	//---字体
	//--这里调用函数setFontFilters()过滤, 显示某一类字体。 默认的情况下为QFontComboBox::AllFonts将列出所有字体
	fontComboBox->setFontFilters(QFontComboBox :: ScalableFonts);		

	//---设置文本打开按钮与打印文本按钮信号与槽
	connect(openBtn, SIGNAL(clicked()), this, SLOT(slotOpenFileDialog()));
	connect(printBtn, SIGNAL(clicked()), this, SLOT(slotPrintText()));		//---文本打印新增
	tipsLabel = new QLabel("open file...", this);

	//---按钮与label布局
	QVBoxLayout *vLayout = new QVBoxLayout();
	vLayout->addStretch();
	vLayout->addWidget(tipsLabel);
	vLayout->addWidget(openBtn);
	vLayout->addWidget(printBtn);		//---文本打印新增
	vLayout->addWidget(boldBtn);
	vLayout->addWidget(colorBtn);
	vLayout->addWidget(underlineBtn);
	vLayout->addWidget(fontLabel);
	vLayout->addWidget(fontComboBox);
	vLayout->addWidget(fontSizeLabel);
	vLayout->addWidget(sizeComboBox);
	vLayout->addStretch();
	vLayout->setSpacing(10);
	
	//---3个控件整体布局
	QHBoxLayout *hLayout = new QHBoxLayout(this);
	hLayout->addLayout(vLayout);
	hLayout->addWidget(showText);
	hLayout->setSpacing(10);
	hLayout->setContentsMargins(10, 10, 10, 10);

	//--显示布局
	setLayout(hLayout);

	//---窗口大小
	resize(600, 400);
	setWindowTitle("TextEdit");
}

//------打开文件对话框
void FileWidget::slotOpenFileDialog()
{
	/*
	getOpenFileName函数说明
	函数原形: QStringList QFileDialog::getOpenFileNames(
	QWidget * parent = 0, 
	const QString & caption = QString(),	//  打开文件对话框的标题
	const QString & dir = QString(),			//	查找目录
	const QString & filter = QString(),		//  设置需要过滤的文件格式
	QString * selectedFilter = 0, 
	Options options = 0) [static]
	*/
	//---获取文件名
	QString fileName = QFileDialog :: getOpenFileName(this, NULL, NULL, "*.h *.cpp *.txt");	

	//---打开文件并读取文件内容
	QFile file(fileName);

	//--打开文件成功
	if (file.open(QIODevice ::ReadOnly | QIODevice ::Text))
	{
		QTextStream textStream(&file);
		while (!textStream.atEnd())
		{
			//---QtextEdit按行显示文件内容
			showText->append(textStream.readLine());
		}
	}
	else	//---打开文件失败
	{
		/*
		information函数参数说明:
		函数原型
		QMessageBox::information(
		QWidget * parent, 
		const QString & title,					//--- 标题
		const QString & text,					//---显示内容
		StandardButtons buttons = Ok,	//---OK按钮
		StandardButton defaultButton = NoButton)	
		[static]
		*/
		QMessageBox ::information(NULL, NULL, "open file error");
	}
}


//---打印文本
void FileWidget::slotPrintText()
{
	QPrinter printer;		//--新建一个QPrinter对象
	QPrintDialog printDlg(&printer, this);

	if (printDlg.exec())				//---用来判断用户是否点击了打印对话框上的“打印”按钮
	{
		//----获取文本内容
		QTextDocument *doc = showText->document();
		// ---打开打印对话窗口
		doc->print(&printer);
	}
}

//---设置字体
void FileWidget::slotShowFontComboBox(QString comboStr)
{
	QTextCharFormat fmt;
	fmt.setFontFamily(comboStr);
	mergeFormat(fmt);
}

//---文本区域应用光标格式
void FileWidget::mergeFormat(QTextCharFormat format)
{
	//---获取文本框中的光标
	QTextCursor cursor = showText->textCursor();	
	//---文本是否为选区
	if (!cursor.hasSelection())
	{
		cursor.select(QTextCursor::WordUnderCursor);
	}
	//---设置光标对应的格式
	cursor.mergeCharFormat(format);
	//--将光标设置的格式应用到文本区域
	showText->mergeCurrentCharFormat(format);
}

//---设置字号
void FileWidget::slotShowSizeSpinBox(QString spinValue)
{
	QTextCharFormat fmt;
	fmt.setFontPointSize(spinValue.toFloat());
	showText->mergeCurrentCharFormat(fmt);
}

//---加粗
void FileWidget::slotShowBoldBtn()
{
	QTextCharFormat fmt;
	fmt.setFontWeight(boldBtn->isChecked()?QFont :: Bold : QFont :: Normal);
	showText->mergeCurrentCharFormat(fmt);
}

//----下划线
void FileWidget::slotShowUnderlineBtn()
{
	QTextCharFormat fmt;
	fmt.setFontUnderline(underlineBtn->isChecked());
	showText->mergeCurrentCharFormat(fmt);
}

//---颜色
void FileWidget::slotShowColorBtn()
{
	//----使用标准颜色对话框获取颜色值
	QColor color = QColorDialog :: getColor(Qt :: blue, this);	//--设定默认选定的颜色 这里请参考assistant
	if (color.isValid())
	{
		QTextCharFormat fmt;
		fmt.setForeground(color);
		showText->mergeCurrentCharFormat(fmt);
	}
}

void FileWidget::slotShowCurrentFormatChanged(const QTextCharFormat &fmt)
{
	fontComboBox->setCurrentIndex(fontComboBox->findText(fmt.fontFamily()));
	sizeComboBox->setCurrentIndex(sizeComboBox->findText(QString :: number(fmt.fontPointSize())));
	boldBtn->setChecked(fmt.font().bold());
	underlineBtn->setChecked(fmt.fontUnderline());
}


main.cpp

#pragma once
#include <QtWidgets/QApplication>
#include "file_widget.h"

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);

	////---解决中文乱码
	//QTextCodec *codec = QTextCodec::codecForName("GB18030");

	FileWidget win;
	win.show();

	return a.exec();
}

附上运行结果

Qt学习之路之文本编辑_第1张图片

你可能感兴趣的:(Qt学习之路之文本编辑)