• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            zhonghua

            C++博客 首頁 新隨筆 聯系 聚合 管理
              72 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks

            #

            設置正則表達式.
            類似下面的
            QRegExp
            這里的用法就是用來檢測QString等字符串錯誤的,例如文件名里面最好就不出現<>|/\:等,所以可以如下定義QRegExp rx("[a-zA-Z0-9\-\\\_]{25}"); 25就是所輸入的字符串個數!a-z當然就是a-z,你也可以abcdefghijklm....等等.\- 就是-

            好了,現在可以把這個rx綁入QRegExpValidator.

            QRegExpValidator *pRevalidotor = new QRegExpValidator(regExp, this);

            綁入lineEdit :

            pEditWell->setValidator(new QRegExpValidator(regExp, this));

            常用的:
            "^\d+$"  //非負整數(正整數 + 0) <br>

            "^[0-9]*[1-9][0-9]*$"  //正整數 <br>

            "^((-\d+)|(0+))$"  //非正整數(負整數 + 0) <br>

            "^-[0-9]*[1-9][0-9]*$"  //負整數 <br>

            "^-?\d+$"    //整數 <br>

            "^\d+(\.\d+)?$"  //非負浮點數(正浮點數 + 0) <br>

            "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮點數 <br>

            "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮點數(負浮點數 + 0) <br>

            "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //負浮點數 <br>

            "^(-?\d+)(\.\d+)?$"  //浮點數 <br>

            "^[A-Za-z]+$"  //由26個英文字母組成的字符串 <br>

            "^[A-Z]+$"  //由26個英文字母的大寫組成的字符串 <br>

            "^[a-z]+$"  //由26個英文字母的小寫組成的字符串 <br>

            "^[A-Za-z0-9]+$"  //由數字和26個英文字母組成的字符串 <br>

            "^\w+$"  //由數字、26個英文字母或者下劃線組成的字符串 <br>

            "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址 <br>

            "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url <br>

            "^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$" // 年-月-日 <br>

            "^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$" // 月/日/年 <br>

            "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"    //Email <br>

            "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"      //電話號碼 <br>

            "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"  

            //IP地址</font></p>

            <p><font size="3" color="#ff9900">^([0-9A-F]{2})(-[0-9A-F]{2}){5}$    //MAC地址的正則表達式 <br>

            ^[-+]?\d+(\.\d+)?$ //值類型正則表達式</font></p>

            </font><br>

            <br>

            <font size="3">QRegExp是Qt的正則表達式類.<br>

            Qt中有兩個不同類的正則表達式.<br>

            第一類為元字符.它表示一個或多個常量表達式.<br>

            令一類為 轉義字符,它代表一個特殊字符.<br>

            <br>

            一.元字符<br>

            . 匹配任意單個字符.例如, 1.3 可能是1. 后面跟任意字符,再跟3<br>

            ^ 匹配字符串首. 例如, ^12可能是123,但不能是312<br>

            $ 配字符串尾. 例如, 12$可以是312, 當不能是 123<br>

            [] 匹配括號內輸入的任意字符.[123]可以為1, 2 或3<br>

            * 匹配任意數量的前導字符. 例如, 1*2可以為任意數量個1(甚至沒有), 后面跟一個2<br>

            + 匹配至少一個前導字符. 例如, 1+2必須為一個或多個1, 后跟一個2<br>

            ? 匹配一個前導字符或為空. 例如 1?2可以為2或這12<br>

            <br>

            二.統配模式<br>

            通過 QRegExp::setPatternSyntax(QRegExp::Wildcard);可以將元字符設置為統配模式.在統配模式下,只有3個元字 符可以使用.他們的功能沒有變化.<br>

            ? 匹配任意單個字符, 例如, 1?2可以為1,后面跟任意單個字符, 再跟2<br>

            * 匹配任意一個字符序列. 例如, 1*2, 可以為1, 后面跟任意數量的字符, 再跟一個2<br>

            [] 匹配一個定義的字符集合. 例如, [a-zA-Z\.]可以匹配 a到z之間任意一個字符和. [^a]匹配出小寫a以外的字符.<br>

            <br>

            三.轉義序列<br>

            \. 匹配"."<br>

            \^ 匹配"^"<br>

            \$ 匹配"$"<br>

            \[ 匹配"["<br>

            \] 匹配"]"<br>

            \* 匹配"*"<br>

            \+ 匹配"+"<br>

            \? 匹配"?"<br>

            \b 匹配響鈴字符,使計算機發出嘟的一聲.<br>

            \t 制表符號<br>

            \n 換行符號<br>

            \r 回車符鉿<br>

            \s 任意空格<br>

            \xnn 匹配16進制為nn的字符<br>

            \0nn 匹配8進制的nn字符<br>

            這些表達式均以\開始, 與C++的轉義字符相同,所以為了定義QRegExp中的一個轉義序列,<br>

            需要在前面添加兩個\\
            posted @ 2012-06-21 10:55 米米 閱讀(355) | 評論 (0)編輯 收藏

            1.
             QTimer *timer = new QTimer( myObject );
             connect( timer, SIGNAL(timeout()), myObject, SLOT(timerDone()) );
             timer->start( 2000, TRUE ); // 2秒單觸發定時器
            QTimer *t = new QTimer( myObject );
            connect( t, SIGNAL(timeout()), SLOT(processOneThing()) );
             t->start( 2000, FALSE ); // 2秒單觸發定時器

            2.void QTimer::singleShot ( int msec, QObject * receiver, const char * member ) [靜態]
            QTimer::singleShot( 10*60*1000, &a, SLOT(quit()) );

            posted @ 2012-06-20 10:27 米米 閱讀(515) | 評論 (0)編輯 收藏

            QWidget及其子類都可有右鍵菜單,因為QWidget有以下兩個與右鍵菜單有關的函數:

            Qt::ContextMenuPolicy contextMenuPolicy () const

            void setContextMenuPolicy ( Qt::ContextMenuPolicy policy )

            Qt::ContextMenuPolicy枚舉類型包括:Qt::DefaultContextMenu, Qt::NoContextMenu, Qt::PreventContextMenu, Qt::ActionsContextMenu, and Qt::CustomContextMenu。

            使用方式如下:


            1)默認是Qt::DefaultContextMenu。
            它 是利用右鍵菜單事件contextMenuEvent()來處理(which means the contextMenuEvent() handler is called)。就是要重寫contextMenuEvent( QContextMenuEvent * event )函數。


            2)使用Qt::CustomContextMenu。
            它是發出QWidget::customContextMenuRequested信號,注意僅僅只是發信號,意味著要自己寫顯示右鍵菜單的slot。
            這個信號是QWidget唯一與右鍵菜單有關的信號(也是自有的唯一信號),同時也是很容易被忽略的signal:

            void customContextMenuRequested ( const QPoint & pos )

            該信號的發出條件是:用戶請求contextMenu(常規就是鼠標右擊啦)且同時被擊的widget其contextMenuPolicy又是Qt::CustomContextMenu。
            注 意:pos是該widget接收右鍵菜單事件的位置,一般是在該部件的坐標系中。但是對于QAbstratScrollArea及其子類例外,是對應著其 視口viewport()的坐標系。如常用的QTableView、QHeaderView就是QAbstratScrollArea的子類。
            因為僅發信號,所以需自己寫顯示右鍵菜單的slot來響應,例如一個表格(QTableView類型)表頭的顯示右鍵菜單槽:
            datatable->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu);
            connect(datatable->horizontalHeader(), SIGNAL(customContextMenuRequested(const QPoint&)),
                    this, SLOT(show_contextmenu(const QPoint&)));//this是datatable所在窗口
            QMenu *cmenu = NULL;
            show_contextmenu(const QPoint& pos)
            {
                if(cmenu)//保證同時只存在一個menu,及時釋放內存
                {
                    delete cmenu;
                    cmenu = NULL;
                }
                QMenu cmenu = new QMenu(datatable->horizontalHeader());
               
                QAction *ascendSortAction = cmenu->addAction("升序");
                QAction *descendSortAction = cmenu->addAction("降序");
                QAction *filterAction = cmenu->addAction("過濾");
                QAction *reshowAction = cmenu->addAction("重載");
               
                connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
                connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
                connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(show_filter_dlg()));
                connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(reshow_data()));
               
                cmenu->exec(QCursor::pos());//在當前鼠標位置顯示
                //cmenu->exec(pos)是在viewport顯示
            }

            也可先做好cmenu,好處是始終使用一個:
                QMenu cmenu = new QMenu(datatable->horizontalHeader());
               
                QAction *ascendSortAction = cmenu->addAction("升序");
                QAction *descendSortAction = cmenu->addAction("降序");
                QAction *filterAction = cmenu->addAction("過濾");
                QAction *reshowAction = cmenu->addAction("重載");
               
                connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
                connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
                connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(show_filter_dlg()));
                connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(reshow_data()));
            show_contextmenu(const QPoint& pos)
            {
                if(cmenu)
                {
                    cmenu->exec(QCursor::pos());
                }
            }


            3)使用Qt::ActionsContextMenu。
            把部件的所有action即QWidget::actions()作為context menu顯示出來。
            還是上面的例子,要在表格(QTableView類型)表頭顯示右鍵菜單:
                    QAction *ascendSortAction = new QAction("升序", this);
                    QAction *descendSortAction = new QAction("降序", this);
                    QAction *filterAction = new QAction("過濾", this);
                    QAction *unfilterAction = new QAction("取消過濾", this);
               
                    connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
                    connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
                    connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(filter_table()));
                    connect(unfilterAction, SIGNAL(triggered(bool)), this, SLOT(unfilter_table()));
               
                    datatable->horizontalHeader()->addAction(ascendSortAction);
                    datatable->horizontalHeader()->addAction(descendSortAction);
                    datatable->horizontalHeader()->addAction(filterAction);
                    datatable->horizontalHeader()->addAction(unfilterAction);
                    
                    datatable->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);

            另外兩個就是不顯示context menu了:
            Qt::NoContextMenu
                the widget does not feature a context menu, context menu handling is deferred to the widget's parent.
               
            Qt::PreventContextMenu
                the widget does not feature a context menu, and in contrast to NoContextMenu, the handling is not deferred to the widget's parent. This means that all right mouse button events are guaranteed to be delivered to the widget itself through mousePressEvent(), and mouseReleaseEvent().

            補充:
                使用Qt::ActionsContextMenu比較簡潔,但是如果需要根據當前菜單彈出的位置來定義不同菜單,或者像上個例子,在表格 (QTableView類型)表頭顯示右鍵菜單時,我需要知道是哪一列表頭被點擊,從而在后來調用sort_ascend()排序函數時能夠根據不同列進 行不同排序策略,那么Qt::ActionsContextMenu就做不到了。
                這種需要捕捉彈出位置的情況只好用Qt::ActionsContextMenu了,customContextMenuRequested ( const QPoint & pos )信號返回點擊位置pos(在表頭視口坐標系中位置),然后表頭即可調用logicalIndexAt(pos)函數得到被點擊section對應的 index即被點擊部分的列號,然后存下來可供后面action激活的排序槽使用。
            show_contextmenu(const QPoint& pos)
            {
                //get related column of headerview
                contextmenu_column = datatable->horizontalHeader()->logicalIndexAt(pos);

                //show contextmenu
                if(cmenu)
                {
                    cmenu->exec(QCursor::pos());
                }
            }

            posted @ 2012-06-01 16:25 米米 閱讀(909) | 評論 (0)編輯 收藏

            qmake 常用命令:
            qmake -project //生成pro文件,自動檢查c/c++程序文件
               qmake -tp vc //根據pro文件生成vc的工程文件,qt commericial有一個綁定到vs的工具,可以在菜單欄直接打開
               qmake -r xxx.pro "CONFIG+=debug" //遞歸生成makefile
               moc //包含Q_OBJECT文件轉換器
               rcc //Qt resource compiler
               uic //Qt ui file translator,to .h file.
             
            Qt 常用宏:
               平臺相關
               Q_WS_WIN //window系統
               Q_WS_X11 //xwindow系統
               Q_WS_MAC //蘋果mac系統
               Q_WS_SOL //sun的solaris系統
               其它
               QT_OPENGL_SUPPORT //是否支援opengl
               QT_VERSION    //qt的版本,如 if QT_VERSION > 0x040601(qt > 4.6.1)
               QT_VERSION_STR //qt版本的字符串
               QT_POINTER_SIZE //指針的字節寬度 32bit=4,64bit=8
               QT_REQUIRE_VERSION //用在代碼中,比如QT_REQUIRE_VERSION(argc, argv, "4.0.2");
            global常用函數
                     T qAbs(const T & value) //返回絕對值
               void qCritical(const char * msg, ...) //輸出告警信息  參賽類似printf
               void qDebug(const char * msg, ... ) // 輸出調試信息
               void qFatal(const char * msg, ... ) //輸出錯誤信息
               qMax(const T & value1,const T & value2 )// 求最大
               qMin(const T & value1,const T & value2 ) // 求最小
            pro 文件格式
            #: 表示到行尾均為注視,被忽略
              include: 可以包含別的文本文件,一般為*pri 例如 #include "../global.pri"
              scope{;;}: 預定義 ,如win32{} 表示在win32平臺下的定義,其它忽略
              win32/unix/linux-g++/linux-g++-64: 平臺宏
              DESTDIR: 產生目標文件路徑
              MOC_DIR: moc轉換文件路徑
              RCC_DIR: 資源文件路徑
              UI_DIR:ui文件轉換的路徑
              LIBEXT: 產生lib的后綴
              QMAKE_CFLAGS_DEBUG:
              QMAKE_CXXFLAGS_DEBUG:
              QMAKE_CFLAGS_RELEASE:
              QMAKE_CXXFLAGS_RELEASE:
              TEMPLATE: 決定生成makefile采用的模板,
               =lib 表示庫文件
               =app 表示生成可執行文件
               =subdirs 表示處理子目錄(在下面用SUBDIRS += **來指定那些子目錄)
              TARGET: 指定目標文件名
              Qt+=: 添加額外的模塊支持,例如Qt -= QtCore;Qt += network,phonon,xml,thread
              DEFINES: 添加額外的宏定義,如win下需要的export等
              DEPENDPATH: 添加以來的路徑
              INCLUDEPATH: 添加頭文件包含路徑
              HEADERS: 需要包含的頭文件
              SOURCES: 需要包含的源文件
              FORMS: 需要包含的ui文件
              RESOURCES:需要包含的資源文件
              LIBS:依賴庫的路徑和名稱 -L{xxdirxx} -l{xxnamexx}
              CONFIG: 添加配置,如warn_on debug_and_release plugin
              TRANSLATIONS: 多國語言支持文件
              INSTALLS: 要安裝的文件
              target.path: 安裝的路徑
              #在pro文件支持environment variables和自定義變量
              #如sources.file += $$SOURCES $$HEADERS
              #sources.path = $$DESTIN_DIR
              #INSTALLS += target source
              defineReplace(xxx): xxx為變量 ,此函數可以返回一個變量值如:$$xxx()
            exists(file1,file2){error()}:檢查文件是否存在
             
            posted @ 2012-05-30 09:49 米米 閱讀(725) | 評論 (0)編輯 收藏

                 摘要: 1、QGridLayout QGridLayout包含多個grid,它并沒有要求其中的每個grid的size相同,通常情況下,每個grid的size是不同的。 對于成員函數addWidget(widget, fromRow, fromColumn, rowSpan, columnSpan, alignment):rowSpan表示新添加進來的widget在垂直方向上跨越或者占據多少個grid。 c...  閱讀全文
            posted @ 2012-05-28 14:47 米米 閱讀(3655) | 評論 (0)編輯 收藏

            這篇文章是在Blogspot上看到的一篇文章,能夠解決QString, wchar_t *, TCHAR和其他字符或字符串類型之間的轉換,方便在使用Windows API的時候轉換的麻煩。

            原文地址:http://tkrotoff.blogspot.com/2010/04/code-snippets-about-qstring-wchart.html

            //QString to wchar_t *: const wchar_t * encodedName = reinterpret_cast<const wchar_t *>(fileName.utf16());  //QString to char * given a file name: QByteArray fileName = QFile::encodeName(aFileName); const char * encodedName = fileName.constData(); //Valid as long as fileName exists  //QString to char * (general case): const char * tmp = str.toUtf8().constData(); [/code] Windows 數據類型: http://msdn.microsoft.com/en-us/library/aa383751.aspx [code lang="cpp"] //TCHAR: #ifdef UNICODE typedef wchar_t TCHAR; #else typedef char TCHAR; #endif  //LPCTSTR: #ifdef UNICODE typedef LPCWSTR LPCTSTR; #else typedef LPCSTR LPCTSTR; #endif  //LPCSTR: typedef const char * LPCSTR;  //LPCWSTR: typedef const wchar_t * LPCWSTR;  //LPCWSTR to QString: QString text(QString::fromUtf16(reinterpret_cast<const unsigned short *>(tmp)));

            另一種解決辦法是使用QString::fromWCharArray(),但這個函數可能導致一些尚未解決的wchar_t符號問題。

            最佳的編程風格: 使用L來定義wchar_t寬字符串,比如 L"text" 字義了一個UNICODE字符串"text"。

            今天又看到一個文章,關于字符串之間的轉換,比較全面,在此將英文翻譯并整理一下。
            原文地址:http://hi.baidu.com/koko200147/blog/item/7e3cad828c9b9bb66d8119cb.html

            QString與其他字符類型之間的轉換,QString在Qt4中是UNICODE編碼的,使用utf16規范。

            QString::fromAscii ( const char * str, int size = -1 ); QString::fromLatin1 ( const char * str, int size = -1 ); QString::fromLocal8Bit ( const char * str, int size = -1 ); QString::fromRawData ( const QChar * unicode, int size ); QString::fromStdString ( const std::string & str ); QString::fromStdWString ( const std::wstring & str ); QString::fromUcs4 ( const uint * unicode, int size = -1 ); QString::fromUtf8 ( const char * str, int size = -1 ); QString::fromUtf16 ( const ushort * unicode, int size = -1 ); QString::fromWCharArray ( const wchar_t * string, int size = -1 );  //qstring ->std::string QString::toStdString () ; QString::toStdWString ();  //BSTR<->QString,不太了解BSTR是什么,還沒用到過,所以不知道對不對 BSTR bstr_str; QString q_str((QChar*)bstr_str, wcslen(bstr_str)); bstr_str = SysAllocString(q_str.utf16());//remember use SysFreeString on BSTR  //QString<->LPCSTR QString::toLocal8Bit().constData(); QString::fromLocal8Bit ( const char * str, int size = -1 );  //QString<->LPCWSTR QString::utf16(); QString::fromUtf16 ( const ushort * unicode, int size = -1 );  //QString<->CString CString c_str(qstring::utf16()); QString fromUtf16 (LPCTSTR(c_str) );

            CString轉換為char*

            //1.傳給未分配內存的const char* (LPCTSTR)指針. CString cstr(asdd); const char* ch = (LPCTSTR)cstr;//ch指向的地址和cstr相同。但由于使用const保證ch不會修改,所以安全.  //2.傳給未分配內存的指針. CString cstr = "ASDDSD"; char *ch = cstr.GetBuffer(cstr1.GetLength() + 1); cstr.ReleaseBuffer(); //修改ch指向的值等于修改cstr里面的值. //PS:用完ch后,不用delete ch,因為這樣會破壞cstr內部空間,容易造成程序崩潰.  //3.第二種用法。把CString 值賦給已分配內存的char *。 CString cstr1 = "ASDDSD"; int strLength = cstr1.GetLength() + 1; char *pValue = new char[strLength]; strncpy(pValue, cstr1, strLength);  //4.第三種用法.把CString 值賦給已分配內存char[]數組. CString cstr2 = "ASDDSD"; int strLength1 = cstr1.GetLength() + 1; char chArray[100]; memset(chArray,0, sizeof(bool) * 100); //將數組的垃圾內容清空. strncpy(chArray, cstr1, strLength1);  //5.如果上述都不行,使用以下方法 CString origCString("Hello, World!"); wchar_t* wCharString = origCString.GetBuffer(origCString.GetLength()+1); size_t origsize = wcslen(wCharString) + 1; size_t convertedChars = 0; char *CharString; CharString=new char(origsize); wcstombs_s(&convertedChars, CharString, origsize, wCharString , _TRUNCATE); cout << CharString << endl; //成功輸出字符串"Hello,World"

            從UTF8編碼到GB編碼的字符串轉換方法:

            QString Utf8_To_GB(QString strText) { return QString::fromUtf8(strText.toLocal8Bit().data()); }

            從GB編碼到UTF8編碼的字符串轉換方法:

            QString GB_To_Utf8(char *strText) { return QString::fromLocal8Bit(strText); }
            posted @ 2012-05-21 13:51 米米 閱讀(1790) | 評論 (0)編輯 收藏

            比如有個事務處理比較耗時間,你可以在中間不時地processEvents()下,這樣好讓界面處理一下各種事件,避免看上去無反應像死掉一樣。
            qApp->processEvents();
            posted @ 2012-05-02 09:56 米米 閱讀(323) | 評論 (0)編輯 收藏

            在程序main.cpp中加入以下代碼


            #include <QTextCodec>

            int main(int argc, char **argv)
            {
                QTextCodec *codec = QTextCodec::codecForName("GB2312");
                QTextCodec::setCodecForLocale(codec);

                QTextCodec::setCodecForCStrings(codec);

                QTextCodec::setCodecForTr(codec);
            }
            這樣在程序其他地方就可以使用中文了, tr(“中文”) 或者直接使用“中文了;


            解決讀取ini文件中中文亂碼

            QSettings settings("xxxx.ini",QSettings::IniFormat);

            settings.setIniCodec(QTextCodec::codecForName("GB2312"));   //在此添加設置,即可讀寫ini文件中的中文

            settings.beginGroup("company");

            解決讀取中文文件中文的亂碼
            QFile file("xxxx.txt");
            QTextStream stream(file,QIODevice::ReadOnly);
            stream.setCodeC( QTextCodec::codecForName("GB2312") );
            stream.readAll();

            posted @ 2012-04-28 13:44 米米 閱讀(365) | 評論 (0)編輯 收藏

            雖然C++標準中有了文件讀取的相關類,也很好用,但是在涉及到QT編程的時候卻用起來不方便了,因為QT本身很多組件都是關聯的自身的 QString類型的字符串,所以再用C++本身String類型的時候就不是那么方便了,需要進行轉化,這樣給程序帶來了復雜度,同時也帶來了轉化的開銷,所以如果用QT開發,可以就用它本身所帶的這些類型進行處理,形成一個系統,便于數據在程序之中的交互和共用。
               QT很好,但是在處理中文或者其他語言的時候要注意編碼格式,如果沒有注意,讀取文件的時候可能讀出來的就是亂碼或者干脆程序就死掉了,這是我們所不愿意看到的,下面就講講怎么樣通過QT的類來讀取中文文件。

            介紹部分
               我們需要用到幾個頭文件中的類:
            #include <qstring.h>
            #include <qfile.h>
            #include <qtextstream.h>
            #include <qtextcodec.h>


            QString

            QString類提供了一個Unicode文本和經典的C以零結尾的字符數組的抽象。
            QString使用隱含共享,這使它非常有效率并且很容易使用。
            所有的QString的方法都使用const char *參數,const char *被解釋為經典的C風格的以零結尾的ASCII字符串。所以const char *參數為0是合法的。如果const char *不是以零結尾的,結果是不確定的。把經典的C字符串復制到QString的函數將不會復制結尾的0字符。QString的QChar數組(可以通過 unicode()返回)通常不以零結尾。如果你需要把QString傳遞到一個需要C的以零結尾的字符串,請使用latin1()。
            沒有分配任何東西的QString是零,也就是長度和數據指針都為0。引用空字符串(“”,一個單一的'\0'字符)的QString是空。零和空這兩個 QString在方法中都是合法的。把(const char *) 0賦值給QString給定了一個零QString。為了方便,QString::null是一個零QString。當排序的時候,空字符串在最前面,然后是非空字符串,然后才是零字符串。我們建議使用if ( !str.isNull() ),而不是if ( !str )來檢測非零字符串,關于解釋說明也可以參考operator!()。
            注意如果你發現你正在混合使用QCString、QString和 QByteArray,這將會導致很多不必要的復制并且也許會預示著你正在處理的真實自然數據是不確定的。如果數據是以零結尾的八位數據,請使用 QCString;如果它是沒有結尾的(也就是包含0)八位數據,請使用QByteArray;如果它是文本,請使用QString。
            字符串列表可以使用QStringList類來處理。你可以使用QStringList::split()來把一個字符串分割為一個字符串列表,并且可以使用 QStringList::join()把一個字符串列表連接成一個使用隨意間隔符的字符串。你也可以使用QStringList::grep()從一個字符串列表中獲得包含特定子字符串或者包含匹配特定的regex的字符串列表。

            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            QFile

            QFile類是一個操作文件的輸入/輸出設備。
            QFile是用來讀寫二進制文件和文本文件的輸入/輸出設備。QFile可以自己單獨被使用,但是如果和QDataStream或QTextStream一起使用將更加方便。
            文件名通常可以通過構造函數來傳遞,但也可以使用setName()來設置。你可以通過exists()來檢查一個文件是否存在并且可以通過remove()來移去一個文件。
            文件可以用open()來打開、用close()來關閉、用flush()來刷新。數據通常可以使用QDataStream或者QTextStream進行讀寫,但你也可以使用readBlock()和readLine()來讀,使用writeBlock()來寫。QFile也支持getch()、 ungetch()和putch()。
            size()可以返回文件的大小。你可以通過使用at()函數得到當前文件位置或者移到一個新的文件位置。如果你到了文件的末尾,atEnd()返回真。handle()返回文件句柄。
            這里是一個使用QTextStream來一行一行地讀取一個文本文件的代碼段。它會把每一行帶上一個行號打印出來。

                QStringList lines;
                QFile file( "file.txt" );
                if ( file.open( IO_ReadOnly ) ) {
                    QTextStream stream( &file );
                    QString line;
                    int n = 1;
                    while ( !stream.eof() ) {
                        line = stream.readLine(); // 不包括“\n”的一行文本
                        printf( "%3d: %s\n", n++, line.latin1() );
                        lines += line;
                    }
                    file.close();
                }
             
            寫文本也很容易(假設我們有一個行的字符串列表要寫):

                QFile file( "file.txt" );
                if ( file.open( IO_WriteOnly ) ) {
                    QTextStream stream( &file );
                    for ( QStringList::Iterator it = lines.begin(); it != lines.end(); ++it )
                        stream << *it << "\n";
                    file.close();
                }

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            QTextStream

            QTextStream類提供了使用QIODevice讀寫文本的基本功能。
            文本流類的功能界面和標準的C++的iostream類非常相似。iostream和QTextStream的不同點是我們的流操作在一個很容易被繼承的QIODevice上,而iostream只能操作一個不能被繼承的FILE *指針。
            Qt提供了幾個和iostream相似的全局函數:
            bin設置QTextStream來讀/寫二進制數字
            oct設置QTextStream來讀/寫八進制數字
            dec設置QTextStream來讀/寫十進制數字
            hex設置QTextStream來讀/寫十六進制數字
            endl強制換行
            flush強制QIODevice刷新任何被緩存的數據
            ws作為任何可用的控制符(在輸入的時候)
            reset重新設置QTextStream為它的缺省模式(請見reset())
            qSetW(int)設置字段寬度作為指定參數
            qSetFill(int)設置填充字符作為指定參數
            qSetPrecision(int)設置精確度作為指定參數
            警告:默認情況下,QTextStream在讀取流的時候,會自動地檢測流中的數字是十進制、八進制、十六進制或者二進制格式。具體情況是,一個以“0”為開頭的數字是八進制的,比如順序為“0100”將會被解釋為64。
            QTextStream類讀寫文本,它不適合處理二進制數據(而QDataStream是適合的)。
            默認情況下,輸出的是使用本地8位編碼后的Unicode文本(比如,QString)。這些可以使用setEncoding()方法進行改變。對于輸入,QTextStream會自動檢測標準Unicode“字節順序標記的”文本文件,否則會使用本地8位編碼。
            QIODevice 在構造函數中被設置,或者之后在setDevice()中使用。如果輸入到達了atEnd(),返回真。數據可以使用operator>> ()重載操作符讀到適當類型的變量中,或者使用read()把它作為整個部分讀到一個單一的字符串中,或者使用readLine()把一次讀一行。使用 skipWhiteSpace()可以忽略控制符。你可以使用flags()或setf()來設置流的標記。這個流也支持width()、 precision()和 fill(),使用reset()可以重新恢復默認設置。
            也可以參考QDataStream、輸入/輸出和網絡和文本相關類.

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            QTextCodec

            QTextCodec 類提供文本編碼之間的轉換。
            QT使用Unicode來存儲,繪制以及操作字符串。在很多情況下,你可能想要使用不同的編碼方式來處理數據。例如大部分的日語文件都被存儲在Shift-JIS或者 ISO2022的文件中,而俄羅斯的用戶常常使用KOI8-R或者CP1251編碼方式。QT提供了一個QTextCodec 類集合來從Unicode格式轉化到相應的格式。

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            代碼部分

            #include <qstring.h>
            #include <qfile.h>
            #include <qtextstream.h>
            #include <qtextcodec.h>

            int main()

             QFile file("test.txt");
             if (file.open(IO_ReadOnly|IO_Raw))
             {
              QTextStream floStream(&file);
              QString line;
              QTextCodec *codec=QTextCodec::codecForName("GBK");
              floStream.setCodec(codec);
              while ( floStream.atEnd()==0 )
              {
               line = codec->fromUnicode(floStream.readLine());
               qWarning(line);
              }
              file.close();   
             }
             return 0;
            }
            代碼中的主要改動就是黃底的部分
            意思就是創立一個中文GBK編碼樣式,然后按照這種方式來把讀入的文件流進行重新編碼,這樣中文就可以順利輸出了,不信你可以試一試,哈哈,先介紹這么多,下次有什么下次再寫啦。

            posted @ 2012-04-26 09:44 米米 閱讀(513) | 評論 (0)編輯 收藏

                QDataWidgetMapper將一個數據庫記錄字段反映到其映射的窗口部件中,同時將窗口部件中所做出的更改反映回數據庫,關鍵是關聯一個model和一組widget
            一、步驟

            1、創建 QDataWidgetMapper 對象
            2、關聯 model
            3、關聯 widgets,并創建其與model中section的映射
            4、定位到某個record

            1. QDataWidgetMapper *mapper = new QDataWidgetMapper;  
            2. mapper->setModel(model);  
            3. mapper->addMapping(mySpinBox, 0);  
            4. mapper->addMapping(myLineEdit, 1);  
            5. mapper->toFirst();  


            提交方式可以設為手動:

            1. mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);  


             QComboBox組件的mapper比較特殊

            第一種、在關系模型中實現mapper到QComboBox組件

            1. QSqlRelationalTableModel *model = QSqlRelationalTableModel(this);  
            2.   
            3. model->setTable("員工表");  
            4. model->setRelation(dep_id,QSqlRelation("部門表","id","name"));  
            5.  // ... 其它代碼  
            6.   
            7. //QComboBox與QListWidget很相擬,因為它有一個內部模型去保存它的數據條目,所以我們用自己建的模型代替那個自帶的模型。給出QSqlRelationalTableModel使用的關系模型,這個模型有兩列,必須指出組合框應該顯示哪一列  
            8. QSqlTableModel *relationModel = model->relationModel(dep_id); // 部門ID  
            9. comboBox->setMode(relationModel);  
            10. comboBox->setModelColumn(relationModel->fieldIndex("name")); // 使用字段名得到正確的標題索引,以使組合框顯示部門名  

             

            第二種、使用代理的方式

            1、實現自定義代理類,實現setEditorData()和setModelData()

            2、給模型添加我們自己的代理類對象

            1. MapDelegate *delegate = new MapDelegate(this); // 生成自定義的代理類對象  
            2. mapper->setItemDelegate(delegate); // 給模型添加我們自己的代理類  
            1. void MapDelegate::setEditorData(QWidget *editor, const QModelIndex& index) const{  
            2.     if(index.column() == 0) // 假如模型的第0列為公司名   
            3.     {  
            4.         QComboBox *comboEditor = qobject_cast<QComboBox *>(editor);  
            5.         if (comboEditor)  
            6.         {  
            7.             int i = comboEditor->findText(index.model()->data(index, Qt::EditRole).toString()); // 在comboBox組件中查找model中的當前公司名  
            8.        comboEditor->setCurrentIndex(i); // 設成model中的當前公司名  
            9.         }         
            10.     }  
            11.     else  
            12.     {  
            13.         return QItemDelegate::setEditorData(editor, index);  
            14.     }  
            15. }  
            16.   
            17. void MapDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex& index) const  
            18. {  
            19.     if(index.column() == 0)  
            20.     {  
            21.         QComboBox *comboBox = qobject_cast<QComboBox *>(editor);  
            22.         if(comboBox)  
            23.         {  
            24.             model->setData(index, comboBox->currentText());  
            25.         }  
            26.     }  
            27.     else  
            28.     {  
            29.         return QItemDelegate::setModelData(editor, model, index);  
            30.     }  
            31. }  
            posted @ 2012-04-24 15:28 米米 閱讀(415) | 評論 (0)編輯 收藏

            僅列出標題
            共8頁: 1 2 3 4 5 6 7 8 
            久久99国产精品99久久| 欧美一区二区三区久久综 | 久久国产精品免费一区| 久久久WWW免费人成精品| 欧美成人免费观看久久| 狠狠色婷婷久久综合频道日韩 | 91精品国产高清久久久久久国产嫩草| 久久久久久午夜成人影院 | 亚洲欧美日韩中文久久| 国产真实乱对白精彩久久| 亚洲AV日韩AV永久无码久久| 99久久国产综合精品成人影院| 久久亚洲精品国产亚洲老地址 | 88久久精品无码一区二区毛片| 狠狠色丁香久久婷婷综合_中 | 久久99精品综合国产首页| 欧美性猛交xxxx免费看久久久| 久久精品夜夜夜夜夜久久| 亚洲国产天堂久久综合| 国产精品久久久久久影院| 亚洲AV乱码久久精品蜜桃| 污污内射久久一区二区欧美日韩| 久久亚洲精品无码AV红樱桃| 伊人色综合久久天天网| 手机看片久久高清国产日韩 | 久久www免费人成看国产片| 国产精品无码久久综合 | 久久精品国产99国产精品导航| 久久精品国产99国产电影网| 国产69精品久久久久9999APGF| 无码乱码观看精品久久| 久久久久亚洲?V成人无码| 国产激情久久久久影院小草| 精品久久久久久久| 久久91综合国产91久久精品| 91久久婷婷国产综合精品青草 | 久久国产精品99久久久久久老狼| 亚洲综合伊人久久综合| 亚洲国产精品无码久久一区二区| 久久久国产视频| 亚洲精品蜜桃久久久久久|