QT學習之阻攔退出程序函數以及事件過濾器的使用,以及文件的操作。

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();
     }

}
發佈了57 篇原創文章 · 獲贊 35 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章