第49课 文本编辑器项目持续开发

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使用卓面环境的系统服务 

猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/81670406