1、开发目标一
指定目标行号并执行跳转动作
用户需求
- 提供输入对话框
-用户可输入目标行号
-确定后光标跳转到指定行
行间跳转算法设计
1. 通过输入对话框获取目标行号
2. 查找换行符的位置计算目标行第一个字符的下标
3. 通过QTextCursor定位到目标行
2、编程实验
连接信号与槽
connect(action, SIGNAL(triggered()), this, SLOT(onEditGoto()));
槽函数定义
void MainWindow::onEditGoto()//行间跳转
{
bool ok = false;
int ln = QInputDialog::getInt(this, "Goto", "Line:", 1, 1, mainEditor.document()->lineCount(), 1, &ok, Qt::WindowCloseButtonHint | Qt::Drawer);
if( ok )
{
QString text = mainEditor.toPlainText();
QTextCursor c = mainEditor.textCursor();
int pos = 0;//换行符下一个位置
int next = -1;//换行符位置
for(int i=0; i<ln; i++)
{
pos = next + 1;
next = text.indexOf('\n', pos);
}
c.setPosition(pos);
mainEditor.setTextCursor(c);
}
}
3、开发目标二
设置工具栏和状态栏的可见性
实现思路
-通过setVisible()设置可见性
-更新界面上QAction对象的状态
✦ 菜单中的QAction对象是否勾选
✦ 工具栏中的QAction对象是否按下
4、编程实验
连接信号与槽
connect(action, SIGNAL(triggered()), this, SLOT(onViewToolBar()));
connect(action, SIGNAL(triggered()), this, SLOT(onViewStatusBar()));
槽函数定义
void MainWindow::onViewToolBar()//设置工具栏的可见性
{
const QObjectList& list = children();
for(int i=0; i<list.count(); i++)
{
QToolBar* tb = dynamic_cast<QToolBar*>(list[i]);
if( tb != NULL )
{
bool visible = tb->isVisible();
tb->setVisible(!visible);
findMenuBarAction("Tool Bar")->setChecked(!visible);
findToolBarAction("Tool Bar")->setChecked(!visible);
break;
}
}
}
void MainWindow::onViewStatusBar()//设置状态栏的可见性
{
QStatusBar* sb = statusBar();
bool visible = sb->isVisible();
sb->setVisible(!visible);
findMenuBarAction("Status Bar")->setChecked(!visible);
findToolBarAction("Status Bar")->setChecked(!visible);
}
5、开发目标三
关于对话框
6、编程实验
AboutDialog.h
#ifndef _ABOUTDIALOG_H_
#define _ABOUTDIALOG_H_
#include <QDialog>
#include <QLabel>
#include <QPlainTextEdit>
#include <QPushButton>
class AboutDialog : public QDialog
{
Q_OBJECT
QLabel m_logoLbl;
QLabel m_qqLbl;
QPlainTextEdit m_infoEdit;
QPushButton m_closeBtn;
public:
explicit AboutDialog(QWidget *parent = 0);
};
#endif // _ABOUTDIALOG_H_
AboutDialog.cpp
#include "AboutDialog.h"
#include <QPixmap>
#include <QPalette>
AboutDialog::AboutDialog(QWidget *parent) :
QDialog(parent, Qt::WindowCloseButtonHint), m_logoLbl(this), m_qqLbl(this), m_infoEdit(this), m_closeBtn(this)
{
QPixmap pm(":/res/pic/dt.png");
pm = pm.scaled(120, 120, Qt::KeepAspectRatio);
m_logoLbl.setPixmap(pm);
m_logoLbl.move(20, 20);
m_logoLbl.resize(120, 120);
QPalette p = m_infoEdit.palette();
p.setColor(QPalette::Active, QPalette::Base, palette().color(QPalette::Active, QPalette::Background));
p.setColor(QPalette::Inactive, QPalette::Base, palette().color(QPalette::Inactive, QPalette::Background));
m_infoEdit.move(200, 30);
m_infoEdit.resize(180, 130);
m_infoEdit.setPalette(p);
m_infoEdit.setFrameStyle(QFrame::NoFrame);
m_infoEdit.setReadOnly(true);
m_infoEdit.insertPlainText("NotePad Project\n\nPlatform: Qt 4.7.4\n\nVersion: 1.0.0\n\nCopyright: D.T.Software");
m_qqLbl.move(22, 184);
m_qqLbl.setText("QQ Group: 199546072");
m_closeBtn.setText("Close");
m_closeBtn.move(273, 175);
m_closeBtn.resize(100, 30);
setFixedSize(390, 230);
setWindowTitle("About NotePad");
connect(&m_closeBtn, SIGNAL(clicked()), this, SLOT(close()));
}
连接信号与槽
connect(action, SIGNAL(triggered()), this, SLOT(onHelpAbout()));
槽函数
void MainWindow::onHelpAbout() //关于对话框
{
AboutDialog(this).exec();
}
7、开发目标四
自定义文本编辑框中的字体和大小
设置文本编辑框是否自动换行
打开外部帮助文件
自定义字体及大小
实现思路
- 通过QFontDialog选择字体以及大小
-将QFont对象设置到文本编辑框
自动换行
实现思路
-获取当前文本编辑框的换行模式
-将模式进行反转后并进行设置
-更新对应QAction对象的状态
打开外部文件
-QDesktopServices提供了一系列桌面开发相关的服务接口
-通过QDesktopServices中的成员函数打开帮助文件
✦ QDesktopServices::openUrl (QUrl("path"))
8、编程实验
连接信号与槽
connect(action, SIGNAL(triggered()), this, SLOT(onFormatWrap()));
connect(action, SIGNAL(triggered()), this, SLOT(onFormatFont()));
connect(action, SIGNAL(triggered()), this, SLOT(onHelpManual()));
槽函数定义
void MainWindow::onFormatWrap() //设置文本编辑框是否自动换行
{
QPlainTextEdit::LineWrapMode mode = mainEditor.lineWrapMode();
if( mode == QPlainTextEdit::NoWrap )
{
mainEditor.setLineWrapMode(QPlainTextEdit::WidgetWidth);
findMenuBarAction("Auto Wrap")->setChecked(true);
findToolBarAction("Auto Wrap")->setChecked(true);
}
else
{
mainEditor.setLineWrapMode(QPlainTextEdit::NoWrap);
findMenuBarAction("Auto Wrap")->setChecked(false);
findToolBarAction("Auto Wrap")->setChecked(false);
}
}
void MainWindow::onFormatFont() //自定义文本编辑框中的字体和大小
{
bool ok = false;
QFont font = QFontDialog::getFont(&ok, mainEditor.font(), this);
if( ok )
{
mainEditor.setFont(font);
}
}
void MainWindow::onHelpManual() //打开外部文件
{
QDesktopServices::openUrl(QUrl("http://www.dt4sw.com"));
}
9、小结
通过输入对话框获取目标行并实现行间跳转
根据用户操作控制状态栏和工具栏的可见性
菜单和工具栏中的QAction对象反映可见性状态
关于对话框用于标识软件自身的信息
使用QFontDialog设置文本编辑框的字体
设置文本编辑框的自动换行属性
通过QDesktopServices使用卓面环境的系统服务