QT学习笔记----day05

八、实例八:电子时钟

依旧一样,先来看看完成的效果:
在这里插入图片描述
实例代码如下:
main.cpp

#include "sublcdnumber.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    SubLcdNumber w;
    w.show();

    return a.exec();
}

lcdnumber.h

#ifndef SUBLCDNUMBER_H
#define SUBLCDNUMBER_H

#include <QWidget>
#include <QLCDNumber>   //电子钟
#include <QMouseEvent>  //鼠标事件
#include <QTimer>   //定时器
#include <QTime>
#include <QDebug>

class SubLcdNumber : public QLCDNumber
{
    Q_OBJECT

public:
    SubLcdNumber(QWidget *parent = 0);
    ~SubLcdNumber();

    QTimer *timer;
    bool showSpace;     //控制显示空格还是:
    QPoint mispos;      //用于保存左顶点与鼠标点击位置的位置差
    void mousePressEvent(QMouseEvent *e);   //鼠标点击事件
    void mouseReleaseEvent(QMouseEvent *e); //鼠标释放事件
    void mouseDoubleClickEvent(QMouseEvent *e); //鼠标双击事件
    void mouseMoveEvent(QMouseEvent *e);    //鼠标移动事件

public slots:
    void slotShowTime();    //显示时间的槽函数
};

#endif // SUBLCDNUMBER_H

lcdnumber.cpp

#include "sublcdnumber.h"

SubLcdNumber::SubLcdNumber(QWidget *parent)
    : QLCDNumber(parent)
{
    this->setWindowTitle("电子时钟demo");
    showSpace = true;
    QPalette pale = this->palette();
    pale.setColor(QPalette::Window,Qt::yellow);
    pale.setColor(QPalette::WindowText,Qt::red);
    this->setPalette(pale);
    /*
     * Qt中三种常用的颜色角色:
     * 1.QFrame及子类:背景颜色:Window  文本颜色:WindowText
     * 2.Button相关类:背景颜色:Button  文本颜色:ButtonText
     * 3.edit相关类:背景颜色: Base          文本颜色:Text
     */

    this->setWindowOpacity(0.8);    //设置透明度
    this->setDigitCount(5);         //设置字符个数

    timer = new QTimer(this);
    this->connect(timer,SIGNAL(timeout()),this,SLOT(slotShowTime()));   //每次超时都会执行显示时间函数
    timer->start(1000);

    this->resize(200,70);
}

void SubLcdNumber::slotShowTime()    //显示时间的槽函数
{
#if 1
//    qDebug() << "FILE : " << __FILE__ << "func : " << __func__ << " LINE : " << endl;
    QTime tim = QTime::currentTime();
    QString timstr = tim.toString("hh:mm");
    if(showSpace)
        timstr[2] = ' ';
    else
        timstr[2] = ':';
    this->display(timstr);      //显示时间
    showSpace = !showSpace;     //切换显示
#endif

#if 0
    //倒计时牌
    int count = (15 - QTime::currentTime().hour() ) * 60 * 60 + (39 - QTime::currentTime().minute()) * 60 + 60 - QTime::currentTime().second();
    if(!count)
        timer->stop();
     this->display(count);
#endif

}

void SubLcdNumber::mousePressEvent(QMouseEvent *e)   //鼠标点击事件
{
    qDebug() << "FILE : " << __FILE__ << "func : " << __func__ << " LINE : " << endl;
    if(e->button() == Qt::LeftButton)       //如果点击鼠标左键
    {
        qDebug() << "鼠标左键点击" << endl;
        mispos = e->globalPos() - this->frameGeometry().topLeft();  //计算位置差
    }
    else if(e->button() == Qt::RightButton)
    {
        qDebug() << "鼠标右键点击" << endl;
        this->close();
    }
    else if(e->button() == Qt::MidButton)
        qDebug() << "鼠标中键点击" << endl;
    e->accept();
}

void SubLcdNumber::mouseReleaseEvent(QMouseEvent *e) //鼠标释放事件
{
    qDebug() << "FILE : " << __FILE__ << "func : " << __func__ << " LINE : " << endl;
    if(e->button() == Qt::LeftButton)
        qDebug() << "鼠标左键释放" << endl;
    else if(e->button() == Qt::RightButton)
        qDebug() << "鼠标右键释放" << endl;
    else if(e->button() == Qt::MidButton)
        qDebug() << "鼠标中键释放" << endl;
}

void SubLcdNumber::mouseDoubleClickEvent(QMouseEvent *e) //鼠标双击事件
{
    qDebug() << "FILE : " << __FILE__ << "func : " << __func__ << " LINE : " << endl;
    if(e->button() == Qt::LeftButton)
        qDebug() << "鼠标左键双击" << endl;
    else if(e->button() == Qt::RightButton)
        qDebug() << "鼠标右键双击" << endl;
    else if(e->button() == Qt::MidButton)
        qDebug() << "鼠标中键双击" << endl;
}

void SubLcdNumber::mouseMoveEvent(QMouseEvent *e)    //鼠标移动事件
{
    qDebug() << "鼠标移动" << endl;
    if(e->buttons() & Qt::LeftButton)
    {
        qDebug() << "鼠标左键拖动" << endl;
        this->move(e->globalPos() - mispos);        //移动到点击位置-位置差的位置
    }
    else if(e->buttons() & Qt::RightButton)
    {
        qDebug() << "鼠标右键拖动" << endl;
    }
    e->accept();
}

SubLcdNumber::~SubLcdNumber()
{
}

实例八笔记:
QLCDNumber类:
QLCDNumber,见名知意,这个控件用于显示一个带有类似LCD(液晶)显示屏效果的数字。支持显示十进制,十六进制,八进制或二进制数。使用display()槽可以容易地连接到数据源,它被重写可以接收五种参数类型。也有一些槽函数可以修改进制的形式,比如setModel(),还可以用setSmallDecimalPoint()设置小数点。
构造函数:
QLCDNumber(QWidget* parent = 0);
QLCDNumber(uint numDigits, QWidget* parent = 0);
常用函数:
const QPalette &palette() const; 获取当前的调色板
void setPalette(const QPalette &); 设置调色板
void setWindowFlags(Qt::WindowFlags type); 设置窗口标志
其中Qt中定义了enum WindowType中有FramelessWindowHint
void setWindowOpacity(qreal level); 设置窗口透明度
void QWidget::resize(int w, int h) 重设大小
void display(const QString &str); 显示字符串
bool close(); 关闭窗口
void QWidget::move(int ax, int ay) 移动窗口
事件:
void mousePressEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
上面的类中,还有一个类需要介绍:
QPalette类:
类定义:class Q_GUI_EXPORT QPalette
函数:void QPalette::setColor(ColorRole acr, const QColor &acolor)
其中QPalette中定义了enum ColorRole Window
基中Qt中定义了enum GlobalColor blue

使用:
如本例中,我们将LCD的背景设置成黄色,字体显示成红色,代码可以这样写:

QPalette pale = this->palette();   //获取当前调色板
pale.setColor(QPalette::Window,Qt::yellow);//设置背景色为黄色
pale.setColor(QPalette::Window,Qt::red);//设置数字显示红色
this->setPalette(pale);//将设置写入到调色板
this->setWindowOpacity(0.8); //设置透明度,这个值为0-1之间的小数,数字越小,透明度越高
this->setDigitCount(5);//设置显示字符个数HH:MM,一个5个字符
this->resize(200,70);//设置窗体大小

鼠标事件,这个简单,实例如下:
需要先在头文件中声明这些函数

void SubLcdNumber::mousePressEvent(QMouseEvent *e)   //鼠标点击事件
{
    qDebug() << "FILE : " << __FILE__ << "func : " << __func__ << " LINE : " << endl;
    if(e->button() == Qt::LeftButton)       //如果点击鼠标左键
    {
        qDebug() << "鼠标左键点击" << endl;
        mispos = e->globalPos() - this->frameGeometry().topLeft();  //计算位置差
    }
    else if(e->button() == Qt::RightButton)
    {
        qDebug() << "鼠标右键点击" << endl;
        this->close();
    }
    else if(e->button() == Qt::MidButton)
        qDebug() << "鼠标中键点击" << endl;
    e->accept();
}

void SubLcdNumber::mouseReleaseEvent(QMouseEvent *e) //鼠标释放事件
{
    qDebug() << "FILE : " << __FILE__ << "func : " << __func__ << " LINE : " << endl;
    if(e->button() == Qt::LeftButton)
        qDebug() << "鼠标左键释放" << endl;
    else if(e->button() == Qt::RightButton)
        qDebug() << "鼠标右键释放" << endl;
    else if(e->button() == Qt::MidButton)
        qDebug() << "鼠标中键释放" << endl;
}

void SubLcdNumber::mouseDoubleClickEvent(QMouseEvent *e) //鼠标双击事件
{
    qDebug() << "FILE : " << __FILE__ << "func : " << __func__ << " LINE : " << endl;
    if(e->button() == Qt::LeftButton)
        qDebug() << "鼠标左键双击" << endl;
    else if(e->button() == Qt::RightButton)
        qDebug() << "鼠标右键双击" << endl;
    else if(e->button() == Qt::MidButton)
        qDebug() << "鼠标中键双击" << endl;
}

void SubLcdNumber::mouseMoveEvent(QMouseEvent *e)    //鼠标移动事件
{
    qDebug() << "鼠标移动" << endl;
    if(e->buttons() & Qt::LeftButton)
    {
        qDebug() << "鼠标左键拖动" << endl;
        this->move(e->globalPos() - mispos);        //移动到点击位置-位置差的位置
    }
    else if(e->buttons() & Qt::RightButton)
    {
        qDebug() << "鼠标右键拖动" << endl;
    }
    e->accept();
}

QTimer类: 定时器类
类定义:class Q_CORE_EXPORT QTimer : public QObject
信号:
void timeout(); 超时信号
槽:
void start(int msec); 启动定时器,在msec毫秒后发出超时信号
void stop(); 停止定时器

QTime类:时间类
类定义:class Q_CORE_EXPORT QTime
构造函数:
QTime(int h, int m, int s = 0, int ms = 0);
常用函数:
static QTime currentTime(); 获取系统当前时间
QString toString(const QString &format) const; 将时间转化为字符串 hh:mm:ss
QMouseEvent类:
Qt::MouseButton button() 获取产生事件的按钮
const QPoint &globalPos() 获取鼠标所在的全局界面中的位置
void accept() 处理鼠标的事件,并做相应处理
Qt::MouseButtons buttons() 获取鼠标事件按钮组要 &某个键
使用:
本例中,获取当前系统时间,我们可以这样做:

Qtime tim = QTime::currentTime();//获取本地时间
QSTring timstr = tim.toString("hh:mm");//将时间转化成字符串,和对应的格式
this->display(str);      //显示时间

九、实例九:文本编辑器

效果界面如下:
在这里插入图片描述
实例代码如下:
main.cpp

#include "mytext.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyText w;
    w.show();

    return a.exec();
}

mytext.h

#ifndef MYTEXT_H
#define MYTEXT_H

#include <QMainWindow>
#include <QMenuBar>     //菜单栏
#include <QMenu>        //菜单
#include <QAction>      //行为(菜单选项)
#include <QToolBar>     //工具栏
#include <QTextEdit>
#include <QFileDialog>
#include <QFile>        //文件类
#include <QTextStream>  //字符流
#include <QDataStream>  //字节流
#include <QMessageBox>
#include <QColorDialog>


class MyText : public QMainWindow
{
    Q_OBJECT

public:
    MyText(QWidget *parent = 0);
    ~MyText();

    QAction *new_action;
    QAction *open_action;
    QAction *save_action;
    QAction *exit_action;
    QAction *copy_action;
    QAction *cut_action;
    QAction *paste_action;
    QAction *color_action;
    QAction *help_action;
    QTextEdit *textedit;

    void create_action();   //创建行为
    void create_menu();     //创建菜单
    void create_toolbar();  //创建工具栏

public slots:
    void slotNew();
    void slotOpenFile();
    void slotSaveFile();
    void slotColor();
    void slotHelp();
};

#endif // MYTEXT_H

mytext.cpp

#include "mytext.h"

MyText::MyText(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle("我的记事本");
    textedit = new QTextEdit;
    this->setCentralWidget(textedit);
    this->create_action();
    this->create_menu();
    this->create_toolbar();

    this->resize(500,400);
}


void MyText::create_action()   //创建行为
{
    new_action = new QAction(QIcon("://images/new.png"),"新 建",this);
    new_action->setShortcut(tr("ctrl+alt+n"));
    new_action->setStatusTip("新 建");
    this->connect(new_action,SIGNAL(triggered()),this,SLOT(slotNew()));

    open_action = new QAction(QIcon("://images/open.png"),"打 开",this);
    open_action->setShortcut(tr("ctrl+alt+o"));
    open_action->setStatusTip("打 开");
    this->connect(open_action,SIGNAL(triggered(bool)),this,SLOT(slotOpenFile()));

    save_action = new QAction(QIcon("://images/save.png"),"保 存",this);
    save_action->setShortcut(tr("ctrl+alt+s"));
    save_action->setStatusTip("保 存");
    this->connect(save_action,SIGNAL(triggered(bool)),this,SLOT(slotSaveFile()));

    exit_action = new QAction("退 出",this);
    exit_action->setShortcut(tr("ctrl+alt+e"));
    exit_action->setStatusTip("退 出");
    this->connect(exit_action,SIGNAL(triggered(bool)),this,SLOT(close()));

    copy_action = new QAction(QIcon("://images/copy.png"),"复 制",this);
    copy_action->setShortcut(tr("ctrl+alt+c"));
    copy_action->setStatusTip("复 制");
    this->connect(copy_action,SIGNAL(triggered(bool)),textedit,SLOT(copy()));

    cut_action = new QAction(QIcon("://images/cut.png"),"剪 切",this);
    cut_action->setShortcut(tr("ctrl+alt+u"));
    cut_action->setStatusTip("剪 切");
    this->connect(cut_action,SIGNAL(triggered(bool)),textedit,SLOT(cut()));

    paste_action = new QAction(QIcon("://images/paste.png"),"粘 贴",this);
    paste_action->setShortcut(tr("ctrl+alt+p"));
    paste_action->setStatusTip("粘 贴");
    this->connect(paste_action,SIGNAL(triggered(bool)),textedit,SLOT(paste()));

    color_action = new QAction("颜 色",this);
    color_action->setShortcut(tr("ctrl+alt+l"));
    color_action->setStatusTip("颜 色");
    this->connect(color_action,SIGNAL(triggered(bool)),this,SLOT(slotColor()));

    help_action = new QAction("帮 助",this);
    help_action->setShortcut(tr("ctrl+alt+h"));
    help_action->setStatusTip("帮 助");
    this->connect(help_action,SIGNAL(triggered(bool)),this,SLOT(slotHelp()));
}

void MyText::create_menu()     //创建菜单
{
    //获取菜单栏
    QMenuBar *mbr = this->menuBar();
    //创建菜单
    QMenu *filemenu = mbr->addMenu("文 件");
    QMenu *editmenu = mbr->addMenu("编 辑");
    QMenu *helpmenu = mbr->addMenu("帮 助");
    //将行为添加到菜单
    filemenu->addAction(new_action);
    filemenu->addAction(open_action);
    filemenu->addAction(save_action);
    filemenu->addSeparator();   //添加分隔线
    filemenu->addAction(exit_action);

    editmenu->addAction(copy_action);
    editmenu->addAction(cut_action);
    editmenu->addAction(paste_action);
    editmenu->addAction(color_action);

    helpmenu->addAction(help_action);
}

void MyText::create_toolbar()  //创建工具栏
{
    //获取工具栏
    QToolBar *file_toolbar = this->addToolBar("file");
    QToolBar *edit_toolbar = this->addToolBar("edit");

    //向具栏添加行为
    file_toolbar->addAction(new_action);
    file_toolbar->addAction(open_action);
    file_toolbar->addAction(save_action);

    edit_toolbar->addAction(copy_action);
    edit_toolbar->addAction(cut_action);
    edit_toolbar->addAction(paste_action);
}

void MyText::slotNew()
{
    MyText *newtext = new MyText(this);
    newtext->move(this->frameGeometry().topLeft() + QPoint(50,50));
    newtext->show();
}

void MyText::slotOpenFile()
{
    QString path = QFileDialog::getOpenFileName(this,"选择文件",":","C++ head(*.h);;C++ source(*.cpp);;all file(*.*)");
    if(!path.trimmed().isEmpty())
    {
        QFile file(path);   //创建文件对象
        QString str = "";
        if(file.open(QIODevice::ReadOnly))
        {
            QTextStream stream(&file);  //创建字符流
            while(!stream.atEnd())
            {
                str = stream.readAll(); //从文件读取内容
                textedit->append(str);
            }
        }
        file.close();
    }
}

void MyText::slotSaveFile()
{
    //文件对话框获取保存文件对话框
    QString path = QFileDialog::getSaveFileName(this,"输入文件名",":","C++ head(*.h);;C++ source(*.cpp)");
    if(!path.trimmed().isEmpty())
    {
    //创建文件对象
        QFile file(path);
        if(file.open(QIODevice::WriteOnly | QIODevice::Truncate))
        {
        //创建字符流
            QTextStream stream(&file);
            stream << textedit->toPlainText();
        //将从文件域获取到的内容写入到这个文件
            stream.flush();
        }
        file.close();
    }
}

void MyText::slotColor()
{
    //获取颜色
    QColor color = QColorDialog::getColor(Qt::blue);
    if(color.isValid())
    {
        //获取调色板
        QPalette pale = this->textedit->palette();
        pale.setColor(QPalette::Text,color);
        //设置字体颜色
        this->textedit->setPalette(pale);
    }
}

void MyText::slotHelp()
{
    QString text = tr("应用程序名:我 的 记 事 本\n")
            + tr("版本: v1.2\n")
            + tr("作者: 张 三\n");
    QMessageBox::about(this,"关于记事本",text);
}

MyText::~MyText()
{

}

实例九笔记:
在本例中我们首先应该知道:
一个主窗口,通常是由一个标题栏,一个菜单栏,若干工具栏和一个任务栏。在这些子组件之间则是我们的工作区。主窗口的最上面是是标题栏 Window Title,按照我们的经验通常用于显示标题最大化、最小化和关闭按钮等.WindowTitle 下面是 MenuBar,也就是菜单栏,用于显示菜单。窗口最底部是 StatusBar,称为状态栏。最外层称为 ToolBar Area,用于显示工具条区域。
Qt中 使用 QAction 类作为动作,QAction 包含了图标、菜单文字、快捷键、状态栏文字、浮动帮助等信息。

QMainWindow类:
QMainWindow是 Qt 框架带来的一个预定义好的主窗口类,他继承于QWidget类。所谓主窗口,就是一个普通意义上的应用程序(不是指游戏之类的那种)最顶层的窗口。比如你现在正在使用的浏览器,那么主窗口就是这个浏览器窗口。QMainWindow的布局是由一个标题栏,一个菜单栏,若干工具栏和一个任务栏。在这些子组件之间则是工作区。
如下图所示:
在这里插入图片描述

本实例就是一个比较好的说明。
构造函数:
QMainWindow(QWidget *parent = 0, Qt::WindowFlags flags = 0);
常用函数:
void setWindowTitle(const QString &);
void setCentralWidget(QWidget *widget); 添加组件
QMenuBar *menuBar() const; 获取菜单栏
void setMenuBar(QMenuBar *menubar); 设置菜单栏
void addToolBar(QToolBar *toolbar); 添加工具栏
QToolBar *addToolBar(const QString &title); 添加工具栏
void removeToolBar(QToolBar *toolbar); 删除工具栏
使用:
比如添加一个多行文本编辑框(文本域),我们可以这么写:

QTextEdit *textedit = new QTextEdit;
this->setCentralWidget(textedit);  //将文本域添加到主窗口下

上面两句实现的效果如下:
在这里插入图片描述
QAction类:
QAction 类作为动作,QAction 包含了图标、菜单文字、快捷键、状态栏文字、浮动帮助等信息。
类定义:
class Q_GUI_EXPORT QAction : public QObject
说明:
1.QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中。
2.Actions可以被添加到菜单和工具栏中,并且可以自动保持在菜单和工具栏中的同步
3.QAction可以包括一个图标,菜单文本,快捷键,状态文本,"What`s This"文本以及一个tooltip。
4. Actions可以作为独立的对象被创建,但是我们也可以在构建菜单的时候创建它们;QMenu类包含了非常简便的方法用于创建适合用作菜单项的actions。
构造函数:
QAction(const QString &text, QObject* parent);
QAction(const QIcon &icon, const QString &text, QObject* parent);
常用函数:
void setShortcut(const QKeySequence &shortcut); 设置快捷键显示
void setShortcut(const QString& command); 设置快捷键显示
QKeySequence shortcut() const; 获取快捷键
void setStatusTip(const QString &statusTip); 设置行为上的显示的文本
QString statusTip() const; 获取行为上显示的文本
信号:
void triggered(bool checked = false); 行为被触发的行为
void changed(); 行为被改变的行为

QMenuBar类:
菜单栏,用于显示菜单。
类定义:class Q_GUI_EXPORT QMenuBar : public QWidget
构造函数:
QMenuBar(QWidget *parent = 0);
常用函数:
QAction *addAction(const QString &text);
QAction *addAction(const QString &text, const QObject receiver, const char member);
QAction *addMenu(QMenu *menu);
QMenu *addMenu(const QString &title);
QMenu *addMenu(const QIcon &icon, const QString &title);

QMenu类:创建菜单
类定义:
class Q_GUI_EXPORT QMenu : public QWidget
构造函数:
QMenu(QWidget *parent = 0);
QMenu(const QString &title, QWidget *parent = 0);
常用函数:
void addAction(QAction *action); 添加行为
void insertAction(QAction *before, QAction *action); 插入行为
void removeAction(QAction *action); 删除行为

使用:
对于QMenuBar类和QMenu类,前者用来获取菜单栏,后者创建具体的菜单
如下:

//获取菜单栏
QMenuBar *mbr = this->menuBar();
//创建菜单
QMenu *filemenu = mbr->addMenu("文 件");
QMenu *editmenu = mbr->addMenu("编 辑");
QMenu *helpmenu = mbr->addMenu("帮 助");

知道了上面两个类的作用,结合Aaction类,我们可以来说下他们的使用方式了:
在本例中,主窗口下最上方(除标题栏外)是一个菜单栏,用于显示菜单,每一个菜单下,有对应的行为功能,如:新建、保存等,那么要实现这些功能,我们可以这么做:

//先创建行为QAction
void MyText::create_action()   //创建行为
{
    new_action = new QAction(QIcon("://images/new.png"),"新 建",this);
    new_action->setShortcut(tr("ctrl+alt+n")); //设置快捷键
    new_action->setStatusTip("新 建");  //行为名
    this->connect(new_action,SIGNAL(triggered()),this,SLOT(slotNew()));//行为发生触发槽函数

    open_action = new QAction(QIcon("://images/open.png"),"打 开",this);
    open_action->setShortcut(tr("ctrl+alt+o"));
    open_action->setStatusTip("打 开");
    this->connect(open_action,SIGNAL(triggered(bool)),this,SLOT(slotOpenFile()));//行为发生触发槽函数

    save_action = new QAction(QIcon("://images/save.png"),"保 存",this);
    save_action->setShortcut(tr("ctrl+alt+s"));
    save_action->setStatusTip("保 存");
    this->connect(save_action,SIGNAL(triggered(bool)),this,SLOT(slotSaveFile()));//行为发生触发槽函数

    exit_action = new QAction("退 出",this);
    exit_action->setShortcut(tr("ctrl+alt+e"));
    exit_action->setStatusTip("退 出");
    this->connect(exit_action,SIGNAL(triggered(bool)),this,SLOT(close()));//行为发生触发槽函数

    copy_action = new QAction(QIcon("://images/copy.png"),"复 制",this);
    copy_action->setShortcut(tr("ctrl+alt+c"));
    copy_action->setStatusTip("复 制");
    this->connect(copy_action,SIGNAL(triggered(bool)),textedit,SLOT(copy()));//行为发生触发槽函数

    cut_action = new QAction(QIcon("://images/cut.png"),"剪 切",this);
    cut_action->setShortcut(tr("ctrl+alt+u"));
    cut_action->setStatusTip("剪 切");
    this->connect(cut_action,SIGNAL(triggered(bool)),textedit,SLOT(cut()));//行为发生触发槽函数

    paste_action = new QAction(QIcon("://images/paste.png"),"粘 贴",this);
    paste_action->setShortcut(tr("ctrl+alt+p"));
    paste_action->setStatusTip("粘 贴");
    this->connect(paste_action,SIGNAL(triggered(bool)),textedit,SLOT(paste()));//行为发生触发槽函数

    color_action = new QAction("颜 色",this);
    color_action->setShortcut(tr("ctrl+alt+l"));
    color_action->setStatusTip("颜 色");
    this->connect(color_action,SIGNAL(triggered(bool)),this,SLOT(slotColor())); //行为发生触发槽函数

    help_action = new QAction("帮 助",this);
    help_action->setShortcut(tr("ctrl+alt+h"));
    help_action->setStatusTip("帮 助");
    this->connect(help_action,SIGNAL(triggered(bool)),this,SLOT(slotHelp()));//行为发生触发槽函数
}
//然后再将上述行为添加到我们菜单栏中,如下代码:
void MyText::create_menu()     //创建菜单
{
    //获取菜单栏
    QMenuBar *mbr = this->menuBar();
    //创建菜单
    QMenu *filemenu = mbr->addMenu("文 件");
    QMenu *editmenu = mbr->addMenu("编 辑");
    QMenu *helpmenu = mbr->addMenu("帮 助");
    //将行为添加到菜单
    filemenu->addAction(new_action);
    filemenu->addAction(open_action);
    filemenu->addAction(save_action);
    filemenu->addSeparator();   //添加分隔线
    filemenu->addAction(exit_action);

    editmenu->addAction(copy_action);
    editmenu->addAction(cut_action);
    editmenu->addAction(paste_action);
    editmenu->addAction(color_action);

    helpmenu->addAction(help_action);
}
//最后,实现最后的槽函数就好
void MyText::slotNew()
{
    MyText *newtext = new MyText(this);
    newtext->move(this->frameGeometry().topLeft() + QPoint(50,50));
    newtext->show();
}

void MyText::slotOpenFile()
{
    QString path = QFileDialog::getOpenFileName(this,"选择文件",":","C++ head(*.h);;C++ source(*.cpp);;all file(*.*)");
    if(!path.trimmed().isEmpty())
    {
        QFile file(path);   //创建文件对象
        QString str = "";
        if(file.open(QIODevice::ReadOnly))
        {
            QTextStream stream(&file);  //创建字符流
            while(!stream.atEnd())
            {
                str = stream.readAll(); //从文件读取内容
                textedit->append(str);
            }
        }
        file.close();
    }
}

void MyText::slotSaveFile()
{
    //文件对话框获取保存文件对话框
    QString path = QFileDialog::getSaveFileName(this,"输入文件名",":","C++ head(*.h);;C++ source(*.cpp)");
    if(!path.trimmed().isEmpty())
    {
    //创建文件对象
        QFile file(path);
        if(file.open(QIODevice::WriteOnly | QIODevice::Truncate))
        {
        //创建字符流
            QTextStream stream(&file);
            stream << textedit->toPlainText();
        //将从文件域获取到的内容写入到这个文件
            stream.flush();
        }
        file.close();
    }
}

void MyText::slotColor()
{
    //获取颜色
    QColor color = QColorDialog::getColor(Qt::blue);
    if(color.isValid())
    {
        //获取调色板
        QPalette pale = this->textedit->palette();
        pale.setColor(QPalette::Text,color);
        //设置字体颜色
        this->textedit->setPalette(pale);
    }
}

void MyText::slotHelp()
{
    QString text = tr("应用程序名:我 的 记 事 本\n")
            + tr("版本: v1.2\n")
            + tr("作者: 张 三\n");
    QMessageBox::about(this,"关于记事本",text);
}

好,本实例中,到此已经完成了80%,下面还剩下一个工具栏和其对应的操作,一样,我们先来学习一下以下几个类:
QToolBar类:
工具栏,用于显示工具。
类定义:
class Q_GUI_EXPORT QToolBar : public QWidget
构造函数:
QToolBar(const QString &title, QWidget *parent = 0);
QToolBar(QWidget *parent = 0);
常用函数:
void setMovable(bool movable); 设置工具栏是否可移动
bool isMovable() const; 获取工具栏的移动状态
void addAction(QAction *action); 添加行为
void insertAction(QAction *before, QAction *action); 插入行为
void removeAction(QAction *action); 删除行为
使用
和上面的菜单栏类似,我们向在工具栏中中添加工具和对应的行为,代码可以这么写:

void MyText::create_toolbar()  //创建工具栏
{
    //获取工具栏
    QToolBar *file_toolbar = this->addToolBar("file");
    QToolBar *edit_toolbar = this->addToolBar("edit");

    //向具栏添加行为
    file_toolbar->addAction(new_action);
    file_toolbar->addAction(open_action);
    file_toolbar->addAction(save_action);

    edit_toolbar->addAction(copy_action);
    edit_toolbar->addAction(cut_action);
    edit_toolbar->addAction(paste_action);
}

至此,我们的小例子的界面已经全部完成,还剩下一些小的东西,比如,文件的打开,读写保存等。好,接下来看看这些内容:
QFile类:
用于操作文件输入输出的类
类定义:
class Q_CORE_EXPORT QFile : public QFileDevice
构造函数:
QFile(const QString &name, QObject *parent);
QFile(const QString &name);
常用函数:
bool open(OpenMode flags);
virtual void close();
其中QIODevice类中定义了

enum OpenModeFlag { 
	NotOpen, 
	ReadOnly, 
	WriteOnly, 
	ReadWrite, 
	Append, 
	Truncate, 
	Text, 
	Unbuffered	};

QTextStream类
文件文本读写的类
类定义:
class Q_CORE_EXPORT QTextStream
构造函数:
QTextStream(QIODevice *device);
QTextStream(FILE *fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite);
QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
常用函数:
bool atEnd() const;
bool seek(qint64 pos);
QString readLine(qint64 maxlen = 0);
QString readAll();
用法:
有了以上两个类,我们向打开一个文件,并把文件中所有内存都写入到我们的文本域中,可以这么做:

void MyText::slotOpenFile()
{
    QString path = QFileDialog::getOpenFileName(this,"选择文件",":","C++ head(*.h);;C++ source(*.cpp);;all file(*.*)");
    if(!path.trimmed().isEmpty())
    {
        QFile file(path);   //创建文件对象
        QString str = "";
        if(file.open(QIODevice::ReadOnly))
        {
            QTextStream stream(&file);  //创建字符流
            while(!stream.atEnd())
            {
                str = stream.readAll(); //从文件读取内容
                textedit->append(str);
            }
        }
        file.close();
    }
}

同样的道理,想要将已经写入文本域中的内容作保存处理,可以这么写:

void MyText::slotSaveFile()
{
    //文件对话框获取保存文件对话框
    QString path = QFileDialog::getSaveFileName(this,"输入文件名",":","C++ head(*.h);;C++ source(*.cpp)");
    if(!path.trimmed().isEmpty())
    {
    //创建文件对象
        QFile file(path);
        if(file.open(QIODevice::WriteOnly | QIODevice::Truncate))
        {
        //创建字符流
            QTextStream stream(&file);
            stream << textedit->toPlainText();
        //将从文件域获取到的内容写入到这个文件
            stream.flush();
        }
        file.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

all of the time

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值