依旧一样,先来看看完成的效果:
实例代码如下:
main.cpp
#include "sublcdnumber.h"
#include
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
#include //电子钟
#include //鼠标事件
#include //定时器
#include
#include
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); //显示时间
#include "mytext.h"
#include
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
#include //菜单栏
#include //菜单
#include //行为(菜单选项)
#include //工具栏
#include
#include
#include //文件类
#include //字符流
#include //字节流
#include
#include
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();
}
}