青岛网站seo价格,做网站和优化共多少钱,用wordpress教程视频,中小型企业网络建设一.UI界面搭建
(ui界面使用#xff0c;界面布局#xff0c;各控件介绍#xff0c;界面大小调整)
二.信号槽机制实现文件的打开#xff0c;保存#xff0c;退出
(信号槽#xff0c;QFile文件类#xff0c;QTextStream类#xff0c;QFileDialog文件对话框#xff0…一.UI界面搭建
(ui界面使用界面布局各控件介绍界面大小调整)
二.信号槽机制实现文件的打开保存退出
(信号槽QFile文件类QTextStream类QFileDialog文件对话框QMessage消息对话框)
//实现功能 : 打开目标文件按照右下角ComboBox所选编码格式打开
void Widget::on_btnopen_clicked()
{//文件内容显示到编辑栏中QString filename QFileDialog::getOpenFileName(this,打开文件,C:\\Users\\SlanderMC\\Desktop);file.setFileName(filename);file.open(QIODevice::ReadWrite|QIODevice::Text);this-setWindowTitle(filename----记事本);QTextStream stream(file);switch (ui-comboBox-currentIndex()) {case 0:stream.setEncoding(QStringConverter::Utf8);break;case 1:stream.setEncoding(QStringConverter::Utf16);break;case 2:stream.setEncoding(QStringConverter::Utf32);break;case 3:stream.setEncoding(QStringConverter::Utf32BE);break;}QString str stream.readAll();ui-textEdit-setText(str);ui-fontsizelabel-setText(QString(%1 px).arg(ui-textEdit-font().pointSize()));
}//实现功能 : 若已打开文件直接保存内容到当前文件 若未打开则用户选择路径进行保存
void Widget::on_btnsave_clicked()
{//编辑后的内容保存到文件if(!file.isOpen()){QString strsave QFileDialog::getSaveFileName(this,保存文件,C:\\Users\\SlanderMC\\Desktop);file.setFileName(strsave);file.open(QIODevice::WriteOnly|QIODevice::Text);this-setWindowTitle(strsave----记事本);}QTextStream stream(file);//按照当前的编码格式写入switch (ui-comboBox-currentIndex()) {case 0:stream.setEncoding(QStringConverter::Utf8);break;case 1:stream.setEncoding(QStringConverter::Utf16);break;case 2:stream.setEncoding(QStringConverter::Utf32);break;case 3:stream.setEncoding(QStringConverter::Utf32BE);break;}stream.seek(0);streamui-textEdit-toPlainText();}//实现功能 : 使用消息对话框,判断用户是否保存
//保存丢弃(断开连接置空文本框)退出
void Widget::on_btnclose_clicked()
{int res QMessageBox::warning(this,提示,您想要保存吗?,QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel);switch (res) {case QMessageBox::Save:on_btnsave_clicked();break;case QMessageBox::Discard:ui-textEdit-clear();if(file.isOpen()){file.close();this-setWindowTitle(记事本);}break;case QMessageBox::Cancel://不做处理break;}
}
三.实现文件切换编码格式功能
(QTextStream类comboBox选择框控件)
//实现功能 : 实施切换当前文件读取的编码格式
void Widget::on_comboBox_currentIndexChanged(int index)
{if(file.isOpen()){int index ui-comboBox-currentIndex();QTextStream stream(file);switch (index) {case 0:stream.setEncoding(QStringConverter::Utf8);break;case 1:stream.setEncoding(QStringConverter::Utf16);break;case 2:stream.setEncoding(QStringConverter::Utf32);break;case 3:stream.setEncoding(QStringConverter::Utf32BE);break;}//seek切换文件光标位置stream.seek(0);ui-textEdit-setText(stream.readAll());}
}
四.实现鼠标当前所在行高亮的功能并在右下角显示行列
textEdit标准控件ExtraSelection类(包括cursor和QTextCharFormat两个成员)
//TextEdit的光标移动信号 “cursorPositionChanged” 对应的槽函数 on_textEdit_cursorPositionChanged
//--------实现功能 : 根据光标位置在右下角显示行列
void Widget::on_textEdit_cursorPositionChanged()
{//textCursor光标类返回一个可视光标QTextCursor tc ui-textEdit-textCursor();//获取行列int block tc.blockNumber()1;int column tc.columnNumber()1;//字符串拼接,标签更改QString str QString(第%1行,第%2列).arg(block).arg(column);ui-labelhl-setText(str);//QTextEdit::ExtraSelection 是一个在 QTextEdit 中用来表示额外的文本选择和高亮的结构。//设置当前行高亮QListQTextEdit::ExtraSelection extralist;//ExtraSelection结构体包括两个成员 QTextCursor 和 QTextCharFormatQTextEdit::ExtraSelection extra;//QTextCursor 表示在文本中的一个位置或者区间而extra.cursor tc;//QTextCharFormat 用于定义这个区间的格式比如背景颜色、字体,下划线等。QTextCharFormat f;f.setBackground(QBrush(Qt::lightGray));f.setFontUnderline(true);f.setUnderlineColor(Qt::white);f.setUnderlineStyle(QTextCharFormat::WaveUnderline);//配置整行显示,否则无效f.setProperty(QTextFormat::FullWidthSelection,true);extra.format f;extralist.append(extra);ui-textEdit-setExtraSelections(extralist);}
五.实现CtrlO打开,CtrlS保存等快捷键功能
QShortCut类QKeySequence类lambda表达式实现信号槽
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);ui-textEdit-installEventFilter(this);this-setWindowIcon(QIcon(:/resourse/open2.png));this-setWindowTitle(记事本);this-setLayout(ui-verticalLayout); //整体Widget垂直布局//快捷键 QT提供的QShortcut类// 并将其快捷键序列设置为 CtrlN实现的。//QKeySequence用以设置快捷键//绑定其activated信号连接到一个槽函数QShortcut *cutopen new QShortcut(QKeySequence(CtrlO),this);QShortcut *cutsave new QShortcut(QKeySequence(CtrlS),this);connect(cutopen,QShortcut::activated,[](){this-on_btnopen_clicked();});connect(cutsave,QShortcut::activated,[](){this-on_btnsave_clicked();});
}六.实现字体放大缩小功能实时显示 (快捷键实现) void Widget::fontsizeup()
{QFont font ui-textEdit-font();font.setPointSize(font.pointSize()1);ui-textEdit-setFont(font);ui-fontsizelabel-setText(QString(%1 px).arg(font.pointSize()));
}void Widget::fontsizedown()
{QFont font ui-textEdit-font();font.setPointSize(font.pointSize()-1);ui-textEdit-setFont(font);ui-fontsizelabel-setText(QString(%1 px).arg(font.pointSize()));
}//设置快捷键字体放大缩小QShortcut *cutsizeup new QShortcut(QKeySequence(Ctrl),this);QShortcut *cutsizedown new QShortcut(QKeySequence(Ctrl-),this);connect(cutsizeup,QShortcut::activated,[](){fontsizeup();});connect(cutsizedown,QShortcut::activated,[](){fontsizedown();});七.实现字体放大缩小功能(Ctrl滚轮实现)
(QT事件事件过滤器eventFilterQEvent类及其子类事件处理流程事件处理函数重写)
①定义一个新的QTextEdit类重写其事件处理函数并将原本的QTextEdit提升为此类
头文件
#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H#include QTextEdit
#include QWidgetclass mytextedit : public QTextEdit
{Q_OBJECT
public:explicit mytextedit(QWidget *parent nullptr);void wheelEvent(QWheelEvent *e) override;void keyPressEvent(QKeyEvent *e)override;void keyReleaseEvent(QKeyEvent *e)override;
private:bool keyPress false;
signals:};#endif // MYTEXTEDIT_H
源文件
#include mytextedit.h
#includeQDebug
#include QTextEdit
#include QWheelEvent
mytextedit::mytextedit(QWidget *parent): QTextEdit{parent}
{}void mytextedit::wheelEvent(QWheelEvent *e)
{if(keyPress true) //按下Ctrl时滑动滚轮切换字体大小{if(e-angleDelta().y() 0 ){zoomIn();}else{zoomOut();}e-accept();}else //没有摁下Ctrl时,默认调动滑块{QTextEdit::wheelEvent(e);}
}void mytextedit::keyPressEvent(QKeyEvent *e)
{if(e-key() Qt::Key_Control) //按下Ctrl{this-keyPress true;}QTextEdit::keyPressEvent(e);
}void mytextedit::keyReleaseEvent(QKeyEvent *e)
{if(e-key() Qt::Key_Control) //按下Ctrl{this-keyPress false;}QTextEdit::keyReleaseEvent(e);
}②.重写事件过滤器
事件处理之前需要经过事件过滤处理所以也可以在事件过滤函数中对某些事件进行拦截比如这里的鼠标滚轮事件。 true表示事件处理完毕不再向下分发false表示事件继续向下分发。
事件过滤器需要安装在某个组件上这里需要安装在Widget类下的TextEdit所以过滤器定义在Widget下并在TextEdit上进行安装。 重写eventFilter
//先前对于事件的处理都是直接重写事件处理函数此次借用 EventFilter事件过滤器来实现对于指定事件的处理
//事件发生-事件过滤-事件分发(分类)-事件处理
//在过滤阶段处理逻辑写完后不希望事件继续排放返回true表示事件已处理完毕。反之返回false继续向下派发由事件处理函数处理
bool Widget:: eventFilter(QObject *watched, QEvent *event)
{QKeyEvent *e (QKeyEvent*)event;if(e-key() Qt::Key_Control ){if(e-type() QKeyEvent::KeyPress){qDebug()key;this-isWheel true;}else if(e-type() QKeyEvent::KeyRelease){qDebug()release;this-isWheel false;}}QWheelEvent *e1 (QWheelEvent*) event;if(e1-type() QEvent::Wheel){if(this-isWheel){if(e1-angleDelta().y() 0){fontsizeup();}else if (e1-angleDelta().y() 0){fontsizedown();}return true;}else{return false;}}
}