您的位置:首页 > 编程语言 > Qt开发

QT学习之阻拦退出程序函数以及事件过滤器的使用,以及文件的操作。

2017-10-21 09:04 1116 查看
http://blog.csdn.net/qq_28174951/article/details/78302690

Qt中的文件操作部分:

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QtDebug>
#include <QTextStream>
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QFile file("./test.txt");
//---参数:QFile::Truncate表示的是 将原文件内容清空,
//--以WriteOnly方式打开文件,如果在工程文件下没有该txt文件,那么程序将创建该文件,若存在,则将原文件内容清空,
if (file.open(QFile::WriteOnly | QFile :: Truncate))
{
//---创建 QTextStream流操作对象, 使与QFile对象file绑定。
QTextStream out(&file);
//----设置输出格式为: 居中,这里格式还可以设置为:right/left。 占10个字符;
out << "socre:" << qSetFieldWidth(10) <<center<< 9023234134<<right<<"12412341234123412343"<<endl;

//-----输出提示信息
qDebug() << "\1   writing data  succesful   \1" << endl;

}
else
{
qDebug() << "open file failed";
}
file.close();       //---关闭文件~~~~~~

QFile file_in("test.txt");
if(!file_in.open(QIODevice::ReadOnly))
{
std::cerr<<"can not open test.txt:"<<file.errorString().toStdString()<<endl;

}
QTextStream in(&file_in);
QString str1;
str1 = in.readAll();
qDebug()<<str1<<endl;

return a.exec();
}


注意: QTextstream out(&file)的作用是创建一个QTextstream 流对象,并且用取址的方式将

输入流与文件进行绑定。

时间过滤器,可以区分事件,可以区分动作

具体的案例:

1.功能描述:界面上有两个按钮,当按下按钮A时,就显示提示窗口,我是按钮a,当按下按钮b时,就显示我是按钮b

这样完成a事件和b事件的一个过滤过程,我们还可以改变QEvent也就是事件的类型,对事件实现进一步的过 滤。

2、定制某个控件的事件处理:

(1)确定需要对哪些控件的哪些事件, 通常的 close以及 key 和 keyboard 事件;

(2)重写该对象的 event() 函数;

3、事件过滤流程:

(1)确定自己需要过滤处理哪些对象的那些事件;

(2)构造自己的事件过滤类: 重写该类的 eventFilter 函数;

(3)在主程序中实例化一个过滤类对象;

(4)调用该过滤类对象的 installEventFilter( receiver, QEvent *event),

以在目标对象上安装该过滤器。

在 Qt 中, event 被建模成派生自abstract QEvent 类的对象, 用来表示在应用程序中发生的事件,或是应用程序需要处理的外部活动产生的事件.

Events 可以被任一 QObject 派生的子类实例对象接收和处理, 但他们是关联到特定控件的. 本文档描述 event 在典型应用程序中是如何发送及处理的.

什么叫做重写??什么叫做重载??

函数重载的条件是什么?函数重写的条件是什么??

重载(overload):是函数名相同,参数列表不同,重载只是在类的内部存在。但是不能靠返回类型来判断。

重写(override):叫做覆盖。子类重新定义父类中有相同名称和参数的虚函数。函数特征相同。但是具体实例不同,主要在继承关系中实现。

重写需要注意:

1.被重写的函数不能是static的。必须是virtual的。

2.重写函数必须有相同的类型。

3.重写函数的访问修饰符可以不同。尽管virtual 是private的,,派生类中可以重写为public,protected也可以的。

重定义:

子类重新定义父类中有相同名称的非虚函数(参数列表可以不同)

如果一个类。存在和父类相同的方法,除非你在调用的时候,强制转化为父类类型,否则试图对子类和父类做类似重载的调用是不能成功的。

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//为按钮控件(button_a,button_b)注册事件
//使用的是installEventFilter(this);函数
ui->button_a->installEventFilter(this);
ui->button_b->installEventFilter(this);
}

Widget::~Widget()
{
delete ui;
}
bool Widget::eventFilter(QObject *target,QEvent *event)
{
if(target == ui->button_a)
{
if(event->type() == QEvent::MouseButtonDblClick)
QMessageBox::about(this,"note!!!","I am ButtonA");
}

if(target ==ui->button_b)
{
if(event->type() == QEvent::MouseButtonDblClick)
QMessageBox::about(this,"note!!!","i am ButtonB");
}
//最后一句返回出eventFiler函数
return QWidget::eventFilter(target,event);

}


退出处理事件

QcloseEvent();

当我们关闭一个程序时,会弹出一个是否确定关闭程序的一个选框,在Qt

中是通过closeEvent函数来实现的;

我们直言将

void Widget::closeEvent(QCloseEvent *event)
{
int ret = QMessageBox::warning(0,tr("QWidget"),tr("are you sure to quit!!!"),QMessageBox::Yes |QMessageBox::No);
if(ret == QMessageBox::Yes)
{
//说accept表示该事件不再继续往上传递
//ignore表示尝试把该事件往上传递
event->accept();
}
else
{
event->ignore();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt
相关文章推荐