【Qt】FileIO


【目的】

  • 檔案讀寫練習,讀取一各檔案並反轉檔案內容,寫入另一個檔案。
  • 讀取 UTF8 檔案並顯示內容。
  • 解析 CSV 內容。 (未完)

【程式】

  1. 反轉檔案內容,寫入另一個檔案。
    1. 程式
      #include <QFile>
      #include <QString>
      #include <iostream>
      using namespace std;
      
      int main(int argc, char *argv[]) {
        QString src(argv[1]);
        QFile srcFile(src);
        if (!srcFile.open(QIODevice::ReadOnly))
        {
          cerr << "Cannot open file for reading:"
               << qPrintable(srcFile.errorString()) << endl;
          return false;
        }
      
        QString dest(argv[2]);
        QFile destFile(dest);
        if (!destFile.open(QIODevice::WriteOnly))
        {
          cerr << "Cannot open file for writing: "
               << qPrintable(destFile.errorString()) << endl;
          return false;
        }
      
        QByteArray in = srcFile.readAll();
        QByteArray out;
      
        // Reverse file content
        for (int i=0; i<in.size()-1; i++)
        {
            out.prepend(in.at(i));
        }
      
        destFile.write(out);
        return srcFile.error() == QFile::NoError
               && destFile.error() == QFile::NoError;
      }
    2. 結果
      假設上面程式執行檔名稱為 reverse

      $ echo "0123456789" > a.txt
      $ ./reverse a.txt b.txt
      $ cat b.txt
      $ 9876543210
  2. 讀取檔案並顯示內容。
    1. 以下就重點做記錄,主要是在讀取檔案的時候指定讀取 utf-8 格式的檔案
      QTextStream stream( &srcFile );
      stream.setCodec("UTF-8");
    2. a.txt (被讀取檔案,請存成utf-8格式)
      Привет
      здравствуйте
    3. dialog.h ( 需被Include的檔案)
      #include <QFile>
      #include <QString>
      #include <iostream>
      #include <QTextStream>
      #include <QtDebug>
      using namespace std;
    4. dialog.cpp ( 在setupUi 之後呼叫)
      int Dialog::ReadFile()
      {
          QFile srcFile(tr("a.txt"));
          if (!srcFile.open(QIODevice::ReadOnly))
          {
              cerr << "Cannot open file for reading:"
                      << qPrintable(srcFile.errorString()) << endl;
              return false;
          }
          QTextStream stream( &srcFile );
          stream.setCodec("UTF-8");
          QString line, lines;
          do {
              line = stream.readLine();
              lines += line;
              lines += "\n";
           } while (!line.isNull());
          ui->textBrowser->setText(lines);
          srcFile.close();
          return srcFile.error() == QFile::NoError;
      }
    5. 結果
      image

【參考】

【問題】

  1. 如何製作 hexdump 類似功能。

【QT】Internationalization


【Proposal】
  1. Providing multilingual files (Traditional Chinese/English/Russian)。

【Basic Steps】

  1. creating a project and naming as lang
  2. add QLabel component and define its Text to “Hello” 。
    Captured from Qt Designer as below。
    image
  3. add multilingual setting to *.pro file
    TRANSLATIONS += lang_zh_TW.ts \
                    lang_en_US.ts \
                    lang_ru_RU.ts
  4. produce *.ts via lupdate
    c:\Qt\2010.03\Qt\bin\lupdate.exe lang.pro 
  5. open lang_zh_TW.ts、lang_en_US.ts、lang_ru_RU.ts via Qt Linguist。 
    1. Russian
      1. 先用 編輯 | 翻譯檔案設定 指定目標語言。
        image
      2. 將 Hello 定義為 здравствуйте,並存檔離開。
        image
    2. 中文部分也是類似上面的作法。
      1. 先用 編輯 | 翻譯檔案設定 指定目標語言為中文。
      2. 將 Hello 定義為 "你好",並存檔離開。
        image
    3. 英文部分直接將 Hello 定義為 Hello 即可。
  6. produce *.pm via lrelease, we’ll get lang_zh_TW.qm、lang_en_US.qm、lang_ru_RU.qm
    c:\Qt\2010.03\Qt\bin\lrelease.exe *.ts
  7. copy *.qm files to execute-file folder (ex. Debug/Release for Windows OS)
  8. 內定語系,讀取 OS的語系
    1. 程式碼
      #include <QTranslator> 
      #include <QLocale> 
      QTranslator translator; 
      translator.load("lang_" + QLocale::system().name())); 
      a.installTranslator(&translator); 
    2. 結果
      image
  9. 指定語系(以俄文為例,強制使用俄文)
    1. 程式碼
      #include <QTranslator> 
      #include <QLocale> 
      QTranslator translator; 
      translator.load("lang_ru_RU"); 
      a.installTranslator(&translator); 
    2. 結果
      image
  10. 讓客戶指定語系,建議(這部分是我的想法,比較省事,否則就要一個一個元件去 setText() )
    1. 出現一個讓客戶可以選定語系的選單(Combox,選單內使用圖檔讓客戶定義語系)。
      客戶選完之後將設定存檔(xml/ini Format)。並提醒客戶重開該應用程式。
    2. 重開之後,按照設定載入語系檔。
  11. 在 MacOsX底下會讀取 zh_CN 檔,而不是 zh_TW,建議先用qDebug() 先行確認。 
    qDebug() << QLocale::system().name();
  12. 參考下面資料,裡面提供語系檔,可參考命名方式
    1. C:\Qt\2010.03\qt\translations
    2. http://code.google.com/p/qwit/source/browse/#svn/trunk/translations 
【Question】
  1. 另一種方法是使用setCodecForTr。不過嘗試製作一個簡單的語言切換選單,
    但發現在俄文底下動作並不正常。
    #include <QTextCodec>
    
    void Dialog::on_comboBox_activated()
    {   
      QString str_hello = tr("Hello");
    
      if (ui->multilingual->currentText() == "Traditional Chinese(Taiwan)")
      {
        QTextCodec::setCodecForTr(QTextCodec::codecForName("Big5-ETen"));
        str_hello = tr("哈囉");
      }else if (ui->multilingual->currentText() == "Pycckom(Russia)")
      {
        QTextCodec::setCodecForTr(QTextCodec::codecForName("KOI8-R"));
        str_hello = tr("здравствуйте");
      }
      ui->label->setText(str_hello);
      qDebug() << str_hello;
    }
  2. 結果
    image
  3. 針對此問題,可以採用 fromUtf8 來指定QString格式。
    但目前 WinXp還有問題,而在MacOs底下動作正常。
    ex. ui->pushButton->setText(QString::fromUtf8("Привет")); 
  4. 猜想是Qt Creator 1.3.1在WinXp存檔格式並非雙字元,如果使用 Editplus 編輯,並存成utf8 格式
    就可以暫時解決這個問題。
    1. 先在 Editplus 修改字串。 
      image
    2. 回到 Qt Creator,雖然看到的是亂碼。
      image
    3. 不過執行出來是正確的。
      image 
    4. 在 Qt Creator 可以選擇檔案格式, Edit | Select Encoding
      這樣就不用再開其他編輯器編輯了。 不過進階使用方式還須研究。
      image image
  5. 參考 Как записать в файл ?
    http://www.prog.org.ru/topic_10946_0.html;prev_next=prev
【參考】

【Google Code】Wiki 的兩三事


除了要了解一些基本的 wiki 語法以外,還有一些很方便的功能

【Sidebar】

  1. 以 androidbmi http://code.google.com/p/androidbmi/wiki/IntroAndroid 為例,
    sidebar 就是左邊的那個側邊攔,有點類似目錄,可以讓使用者更加容易閱讀你的Wiki。
    image
  2. 首先先新增一個名為 TableOfContents 的頁面。
  3. 之後到 Administer/Wiki 並把 TableOfContents  填到 Wiki Sidebar 這個欄位。
    image
  4. 存檔之後,點選每個網頁,就會出現側邊攔。

【Wiki首頁】

  1. 當使用者點選Wiki,卻只看到令人不知手措的檔案列表?!
    如果只有幾個頁面還好,但當頁面一多,還需一個一個去找首頁在那邊,實在很浪費時間。
    image
  2. 有一個方式可以解決大家的痛苦,請直接在 Administer/Wiki 的 Wiki 欄位填上首頁的名稱。
    這樣子使用點選Wiki這個標籤,看到的就是一個網頁,而不是Wiki的檔案列表。

    image

【參考】

【Qt】Tree Widget


雖然有 QListWidget/QListWidget與QListBox,但在Qt Designer都找不到如何產生SubItem的方法。
所以採用QTreeWidget達到類似的效果。速記一下會用到的東西。

  1. 使用的 Tree Widget 在Qt Designer是長這樣。
    image
  2. Columns 定義欄位名稱。
    image
  3. Item定義樹狀內容。
    image
  4. 紅色框框部分就是剛剛用Qt Designer做出來的結果。
    image
  5. 取回目前所點選的 row/col(假設 mapping 到 activated 這事件)
    void ContentsDialog::on_ContentsTree_activated(QModelIndex index)
    {
      int row = index.row();
      int col = index.column();
      qDebug()<< row << col;
    }
  6. 取回目前所點選的內容(須考證)
    void ContentsDialog::on_ContentsTree_activated(QModelIndex index)
    {
      QString str = index.data(index.row()).toString();
    }

【參考】

  1. Qt4 Gossip: QTreeWidget 與 QTreeWidgetItem
    http://caterpillar.onlyfun.net/Gossip/Qt4Gossip/QTreeWidgetQTreeWidgetItem.html
  2. Qt4 Gossip: QListWidget 與 QListWidgetItem
    http://caterpillar.onlyfun.net/Gossip/Qt4Gossip/QListWidgetQListWidgetItem.html
  3. 在Qt4中使用QPersistentModelIndex传递QModelIndex
    http://www.qtchina.net/?q=node/445
  4. Qt Model/View 学习笔记 (六)
    http://www.cppblog.com/yuanyajie/archive/2007/06/19/26622.html
  5. Qt学习之路(47): 自定义Model之三 (转载)
    http://www.yafeilinux.com/?p=236
  6. QTableView - get data of selected item
    http://www.qtforum.org/article/14612/qtableview-get-data-of-selected-item.html

【Qt】Space


有時候常常會看到下面藍色這種像彈簧一樣的東西,以 Qwit 的 AboutDialog 為例。
image

原來這種東西叫 Horizontal/Vertical Space。用來排版GUI元件與元件間的距離。
image

設定的話以 Vertical Space 為例, Height 就是增加這元件 Space 高度。

image

【Qt】QMainWindow加入 QDialog


【目的】

  • 在原本有的 QMainWindow 加入QDialog(例如 about Dialog)。

【步驟】

因為沒時間在Qt Creator找正規方法,目前只好先記錄一下旁門左道的方式。

  1. 從 qwit 的專案(http://code.google.com/p/qwit/source/browse/#svn/trunk/src)
    抓取三個檔案並放入目前專案目錄。記得裡面一些 include 的路徑要更正成實際需要的路徑/檔案。
    1. AboutDialog.h (拿掉#include "QwitHeaders.h")
    2. AboutDialog.cpp (拿掉 #include "QwitHeaders.h" )
    3. AboutDialog.ui (將ObjectName 改成你要的名字)
  2. 使用 Add Existing Files 把這三個檔案加入目前專案。
    image
  3. 修改 mainwindows.h
    1. 在 private 加入類別
      image
    2. 在 private slots 宣告函數
      image
    3. 引入 AboutDialog.h
      image
  4. 在 mainwindows.cpp 綁定相對應的事件,並使用 .show 把該 Dialog 顯示出來。
    image
  5. 執行之後就確定編譯成功。就可以修正 AboutDialog.ui … 該修正的內容。

【Format Factory】格式工廠


Format Factory http://www.formatoz.com/

【Rmvb支援】

目前我是用 2.30 ,已經完全支援 rmvb 的轉檔,不用再去找另外一個應用程式輔助了。
需要合併或剪輯 rmvb 的話,可以用RealMedia Editor來輔助。另外如果需要在vm底下做轉檔,記得把 cpu加多(2個以上),memory加大,這樣跑起來會比較快。

 

Ed32. Copyright 2008 All Rights Reserved Revolution Two Church theme by Brian Gardner Converted into Blogger Template by Bloganol dot com