• <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>
            posts - 319, comments - 22, trackbacks - 0, articles - 11
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            1. 示例代碼
            self.originalPixmap = QtGui.QPixmap.grabWindow(QtGui.QApplication.desktop().winId())

            2.關于QPixmap類的grabWIndow

            QPixmap QPixmap::grabWindow ( WId window, int x = 0, int y = 0, int width = -1, int height = -1 ) [static]

            Creates and returns a pixmap constructed by grabbing the contents of the given window restricted by QRect(x, y, width, height).

            The arguments (x, y) specify the offset in the window, whereas (width, height) specify the area to be copied. If width is negative, the function copies everything to the right border of the window. If height is negative, the function copies everything to the bottom of the window.

            The window system identifier (WId) can be retrieved using the QWidget::winId() function. The rationale for using a window identifier and not a QWidget, is to enable grabbing of windows that are not part of the application, window system frames, and so on.

            The grabWindow() function grabs pixels from the screen, not from the window, i.e. if there is another window partially or entirely over the one you grab, you get pixels from the overlying window, too. The mouse cursor is generally not grabbed.

            Note on X11 that if the given window doesn't have the same depth as the root window, and another window partially or entirely obscures the one you grab, you will not get pixels from the overlying window. The contents of the obscured areas in the pixmap will be undefined and uninitialized.

            On Windows Vista and above grabbing a layered window, which is created by setting the Qt::WA_TranslucentBackground attribute, will not work. Instead grabbing the desktop widget should work.

            Warning: In general, grabbing an area outside the screen is not safe. This depends on the underlying window system.

            posted @ 2011-04-29 22:56 RTY 閱讀(1483) | 評論 (0)編輯 收藏

            有的時候,我們希望自己的操作帶上系統的響鈴。
            可以這樣操作:
                        QtGui.qApp.beep()


            以下是beep的說明

            void QApplication::beep () [static]

            Sounds the bell, using the default volume and sound. The function is not available in Qt for Embedded Linux.

            posted @ 2011-04-29 22:53 RTY 閱讀(459) | 評論 (0)編輯 收藏

                     我們中的大多數人都經歷過費解代碼的糾纏。我們中的許多人自己就編寫過費解的代碼。寫出自己能理解的代碼很容易,因為在寫這些代碼時,我們正深入于要解決的問題中。代碼的其他維護者不會那么深入,也就不易理解代碼。
                     軟件項目的主要成本在于長期維護。為了在修改時盡量降低出現缺陷的可能性,很有必要理解系統是做什么的。當系統變得越來越復雜,開發者就需要越來越多的時間來理解它,而且業績有可能誤解。所以,代碼應當清晰地表達其作者的意圖。作者把代碼寫得越清晰,其他人花在理解代碼上的時間也就越少,從而減少缺陷,縮減維護成本。
                   可以通過選用好名稱來表達。我們想要聽到好類名和好函數名,而且在查看其權則時不會大吃一驚。
                   也可以通過保持函數和類尺寸短小來表達。短小的類和函數通常易于命名,易于編寫,易于理解。
                   還可以通過采用標準命名法來表達。例如,設計模式很多大程度上就關乎溝通和表達。通過在實現這些模式的類的名稱中采用標準模式名,例如COMMAND或VISITOR,就能充分地向其他開發者描述你的設計。
                   編寫良好的單元測試也具有表達性。測試的主要目的之一就是通過實例起到文檔的作用。讀到測試的人應該能很快理解某個類是做什么的。
                   不過,做到表達力的最重要方式卻是嘗試。有太多時候,我們寫出能工作的代碼,就轉移到下一個問題上,沒有下足功夫調整代碼,讓后來者易于閱讀。技戰術,下一位讀代碼的人最有可能是你自己。
                   所以,多少尊重一下你的手藝吧。花一點點時間在每個函數和類上。選用較好的名稱,將大函數切分為小函數,時時關注自己創建的東東,用心是最珍貴的資源。

            posted @ 2011-04-26 21:20 RTY 閱讀(305) | 評論 (0)編輯 收藏

            1、使用異常而非返回碼
            例子:
            public class DeviceController {
            public void sendShutDown() {
              try {
                 tryToShutDown();
              } catch (DeviceShutDownError e) {
                 logger.log(e);
            }


            private void tryToShutDown() throws DeviceShutDownError {
            ..
            }

            2. 別返回null值
            檢查null 值出現的問題

            posted @ 2011-04-25 21:46 RTY 閱讀(314) | 評論 (0)編輯 收藏

            下載地址:http://sourceforge.net/projects/gecrit/files/

            posted @ 2011-04-23 18:07 RTY 閱讀(463) | 評論 (0)編輯 收藏

                 摘要: assert() 函數用法  閱讀全文

            posted @ 2011-04-20 21:18 RTY 閱讀(1019) | 評論 (0)編輯 收藏

                 摘要: 標準C++的一些約定   閱讀全文

            posted @ 2011-04-20 21:15 RTY 閱讀(155) | 評論 (0)編輯 收藏

                 摘要: Windows 60個常用API附錄A 常用的Windows API 調用本附錄列出了PowerBuilder 常用Windows API 系統調用同時給出了這些函數的功能說明方式以及應用示例下表首先給出常用API 調用的名稱和扼要功能讀者需要詳細了解某個函數的聲明格式和示例時可通過序號在本附錄中找到相應說明表A 常用的Windows API 系統序號 函數 功能1 Arc() 在窗口上畫一條弧線...  閱讀全文

            posted @ 2011-04-19 23:23 RTY 閱讀(1376) | 評論 (0)編輯 收藏

            寫的不錯,轉一下:

            首先呢,聲明一下,QString 是不存在中文支持問題的,很多人遇到問題,并不是本身 QString 的問題,而是沒有將自己希望的字符串正確賦給QString。

            很簡單的問題,"我是中文"這樣寫的時候,它是傳統的 char 類型的窄字符串,我們需要的只不過是通過某種方式告訴QString 這四個漢字采用的那種編碼。而問題一般都出在很多用戶對自己當前的編碼沒太多概念,

            于是

            一個簡 單的 Qt 程序

            下面這個小程序,估計大家會感到比較親切。似乎有相當多的中文用戶嘗試寫過這樣的代碼:

            #include <QtGui/QApplication>
            #include <QtGui/QLabel>

            int main(int argc, char **argv)
            {
            QApplication app(argc, argv);
            QString a= "我是漢字";
            QLabel label(a);
            label.show();
            return app.exec();
            }

            編碼,保存,編譯,運行,一切都很順利,可是結果呢?

            多數用戶看到

            其他用戶看到

            ÎÒÊǺº×Ö

            æˆ‘æ˜¯æ±‰å —

            出乎意料,界面上中文沒顯示出來,出現了不認識字符。 于是開始用搜索引擎搜索,開始上論壇發帖或抱怨

            最后被告知,下面的語句之一可以解決問題:

            QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
            QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

            兩條指令挨個一試,確實可以解決(多數用戶是第一條,其他用戶是第二條)。那么,為什么會這樣呢?

            兩種亂碼什么時候出現

            對這個問題,我想大家可能都有話說。在繼續之前,我們先列個表,看看兩種亂碼分別在那種情況下出現:

            我們只列舉大家最常用的3個編譯器(微軟VS的中的cl,Mingw中的g++,Linux下的g++),源代碼分別采用 GBK 和 不帶BOM的UTF-8  以及 帶BOM的UTF-8 這3中編碼進行保存。

            源代碼的編碼

            編譯器

            結果

            GBK

            cl

            1

            *

            mingw-g++

            1

            *

            g++

            1

            UTF-8(不帶BOM)

            cl

            2

            mingw-g++

            2

            g++

            2

            *

            UTF-8(帶BOM)

            cl

            1

            mingw-g++

            2

            g++

            編譯失敗

            采用3種不同編碼保存的源代碼文件,分別用3種不同的編譯器編譯,形成9種組合,除掉一種不能工作的情況,兩種亂碼出現的情況各占一半。

            從中我們也可以看出,亂碼和操作系統原本是沒有關系的。但我們在 Windows 一般用的GBK,linux一般用的是不帶BOM的UTF-8。如果我們只考慮帶*的情況,也可以說兩種亂碼和系統有關。

            QString 為什么會亂碼呢?

            真的是 QString 亂碼了嗎?我們可以問問自己,我們抱怨的對象是不是搞錯了?

            繼續之前,先明確幾個概念:

            明確概念1:

            "我是漢字" 是C語言中的字符串,它是char型的窄字符串。上面的例子可寫為

            const char * str = "我是漢字";
            QString a= str;

            char str[] = "我是漢字";
            QString a= str;

            明確概念2:

            源文件是有編碼的,但是這種純文本文件卻不會記錄自己采用的編碼

            這個是問題的根源,不妨做個試驗,將前面的源代碼保存成GBK編碼,用16進制編輯器能看到引號內是ce d2 ca c7 ba ba d7 d6這樣8個字節。

            現在將該文件拷貝到正體(繁體)中文的Windows中,用記事本打開會什么樣子呢?

            ...
            QString a= "扂岆犖趼";
            QLabel label(a);
            label.show();
            ...

            那么放到歐美人的Windows系統中,再用記事本打開呢?

            ...
            QString a= "ÎÒÊǺº×Ö";
            QLabel label(a);
            label.show();
            ...

            同一個文件,未做任何修改,但其中的8個字節ce d2 ca c7 ba ba d7 d6,對用GBK的大陸人,用BIG5的港澳臺同胞,以及用Latin-1的歐洲人看來,看到的卻是完全不同的文字。

            明確概念3:

            如同我們都了解的'A'與'\x41'等價一樣。

            GBK編碼下的

            const char * str = "我是漢字"

            等價于

            const char * str = "\xce\xd2\xca\xc7\xba\xba\xd7\xd6";

            當用UTF-8編碼時,等價于

            const char * str = "\xe6\x88\x91\xe6\x98\xaf\xe6\xb1\x89\xe5\xad\x97";

            注意:這個說法不全對,比如保存成帶BOM的UTF-8,用cl編譯器時,漢字本身是UTF-8編碼,但程序內保存時卻是對應的GBK編碼。

            明確概念4:

            QString 內部采用的是Unicode。

            QString內部采用的是 Unicode,它可以同時存放GBK中的字符"我是漢字",BIG5中的字符"扂岆犖趼" 以及Latin-1中的字符"ÎÒÊǺº×Ö"。

            一個問題是,源代碼中的這8個字節"\xce\xd2\xca\xc7\xba\xba\xd7\xd6",該怎么轉換成Unicode并存到 QString 內?按照GBK、BIG5、Latin-1還是其他方式...

            在你不告訴它的情況下,它默認選擇了Latin-1,于是8個字符"ÎÒÊǺº×Ö"的unicode碼被存進了QString中。最終,8個Latin字符出現在你期盼看到4中文字符的地方,所謂的亂碼出現了

            QString 工作方式

            const char * str = "我是漢字";
            QString a= str;

            其實很簡單的一個問題,當你需要從窄字符串 char* 轉成Unicode的QString字符串的,你需要告訴QString你的這串char* 中究竟是什么編碼?GBK、BIG5、Latin-1

            理想情況就是:將char* 傳給QString時,同時告訴QString自己的編碼是什么:

            就像下面的函數一樣,QString的成員函數知道按照何種編碼來處理 C 字符串

            QString QString::fromAscii ( const char * str, int size = -1 )
            QString QString::fromLatin1 ( const char * str, int size = -1 )
            QString QString::fromLocal8Bit ( const char * str, int size = -1 )
            QString QString::fromUtf8 ( const char * str, int size = -1 )

            單QString 只提供了這幾個成員函數,遠遠滿足不了大家的需求,比如,在簡體中文Windows下,local8Bit是GBK,可是有一個char串是 BIG5 或 Latin-2怎么辦?

            那就動用強大的QTextCodec吧,首先QTextCodec肯定知道自己所負責的編碼的,然后你把一個char串送給它,它就能正確將其轉成Unicode了。

            QString QTextCodec::toUnicode ( const char * chars ) const

            可是這個調用太麻煩了,我就想直接

            QString a= str;

            QString a(str);

            這樣用怎么辦?

            這樣一來肯定沒辦法同時告訴 QString 你的str是何種編碼了,只能通過其他方式了。這也就是開頭提到的

            QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
            QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

            設置QString默認采用的編碼。而究竟采用哪一個,一般來說就是源代碼是GBK,就用GBK,源代碼是UTF-8就用UTF-8。但有一個例外,如果你保存成了帶BOM的UTF-8而且用的微軟的cl編譯器,此時仍是GBK。

            posted @ 2011-04-19 23:09 RTY 閱讀(473) | 評論 (0)編輯 收藏

            在使用C++編程的過程中,常常需要對類成員進行初始化,通常的方法有兩種:

            第一種方法:

            CMYClass::CSomeClass()
            {
            x
            =0;
            y
            =1;
            }

            第二種方法:

            CSomeClass::CSomeClass() : x(0), y(1)
            {
            }

             

            本文將要探討這兩種方法的異同以及如何使用這兩種方法。

                從技術上說,第二種方法比較好,但是在大多數情況下,兩者實際上沒有什么區別。第二種語法被稱為成員初始化列表,之所以要使用這種語法有兩個原因:一個原因是必須這么做,另一個原因是出于效率考慮。

                讓我們先看一下第一個原因——必要性。設想你有一個類成員,它本身是一個類或者結構,而且只有一個帶一個參數的構造函數。

             

            class CMyClass {
            CMember m_member;
            public:
            CMyClass();
            };

             

            // 必須使用初始化列表來初始化成員 m_memberCMyClass::CMyClass() : m_member(2){•••}
                沒有其它辦法將參數傳遞給m_member,如果成員是一個常量對象或者引用也是一樣。根據C++的規則,常量對象和引用不能被賦值,它們只能被初始化。

                使用初始化列表的第二個原因是出于效率考慮,當成員類具有一個缺省的構造函數和一個賦值操作符時。MFC的CString提供了一個完美的例子。假定你有一個類CMyClass具有一個CString類型的成員m_str,你想把它初始化為"Hi,how are you."。你有兩種選擇:

            CMyClass::CMyClass() {// 使用賦值操作符// CString::operator=(LPCTSTR);m_str = _T("Hi,how are you.");}
            // 使用初始化列表// 和構造函數 CString::CString(LPCTSTR)CMyClass::CMyClass() : m_str(_T("Hi,how are you.")){}
                在它們之間有什么不同嗎?是的。編譯器總是確保所有成員對象在構造函數體執行之前被初始化,因此在第一個例子中編譯的代碼將調用CString::Cstring來初始化m_str,這在控制到達賦值語句前完成。在第二個例子中編譯器產生一個對CString:: CString(LPCTSTR)的調用并將"Hi,how are you."傳遞給這個函數。結果是在第一個例子中調用了兩個CString函數(構造函數和賦值操作符),而在第二個例子中只調用了一個函數。

                在CString的例子里這是無所謂的,因為缺省構造函數是內聯的,CString只是在需要時為字符串分配內存(即,當你實際賦值時)。但是,一般而言,重復的函數調用是浪費資源的,尤其是當構造函數和賦值操作符分配內存的時候。在一些大的類里面,你可能擁有一個構造函數和一個賦值操作符都要調用同一個負責分配大量內存空間的Init函數。在這種情況下,你必須使用初始化列表,以避免不要的分配兩次內存。

                在內建類型如ints或者longs或者其它沒有構造函數的類型下,在初始化列表和在構造函數體內賦值這兩種方法沒有性能上的差別。不管用那一種方法,都只會有一次賦值發生。有些程序員說你應該總是用初始化列表以保持良好習慣,但我從沒有發現根據需要在這兩種方法之間轉換有什么困難。在編程風格上,我傾向于在主體中使用賦值,因為有更多的空間用來格式化和添加注釋,你可以寫出這樣的語句:
            x=y=z=0;
            或者
            memset(this,0,sizeof(this));
            注意第二個片斷絕對是非面向對象的。

                當我考慮初始化列表的問題時,有一個奇怪的特性我應該警告你,它是關于C++初始化類成員的,它們是按照聲明的順序初始化的,而不是按照出現在初始化列表中的順序。

            class CMyClass {    CMyClass(int x, int y);    int m_x;    int m_y;};CMyClass::CMyClass(int i) : m_y(i), m_x(m_y){}
                你可能以為上面的代碼將會首先做m_y=i,然后做m_x=m_y,最后它們有相同的值。但是編譯器先初始化m_x,然后是m_y,,因為它們是按這樣的順序聲明的。結果是m_x將有一個不可預測的值。這個例子是故意這樣設計來說明這一點的,然而這種bug會很自然地出現。有兩種方法避免它,一個是總是按照你希望它們被初始化的順序來聲明成員,第二個是,如果你決定使用初始化列表,總是按照它們聲明的順序羅列這些成員。這將有助于消除混淆。

            class CMember {
            public:
            CMember(
            int x) { ... }
            };

            因為CMember有一個顯式聲明的構造函數,編譯器不產生一個缺省構造函數(不帶參數),所以沒有一個整數就無法創建CMember的一個實例。

            CMember* pm = new CMember;        // 出錯!!
            CMember* pm = new CMember(2);     // OK

                如果CMember是另一個類的成員,你怎樣初始化它呢?答案是你必須使用成員初始化列表。

            posted @ 2011-04-19 23:04 RTY 閱讀(238) | 評論 (0)編輯 收藏

            僅列出標題
            共31頁: First 23 24 25 26 27 28 29 30 31 
            国产亚洲欧美成人久久片| 热99RE久久精品这里都是精品免费| 亚洲精品乱码久久久久久蜜桃| 久久久WWW免费人成精品| 久久伊人精品青青草原日本| 久久精品国产日本波多野结衣| 国内精品伊人久久久久AV影院| 99久久免费只有精品国产| 久久中文字幕人妻熟av女| 精品午夜久久福利大片| 久久精品国产亚洲AV忘忧草18| 色成年激情久久综合| 国产精品中文久久久久久久| 丰满少妇人妻久久久久久| 久久精品中文字幕有码| 大伊人青草狠狠久久| 偷窥少妇久久久久久久久| 精品久久久久久中文字幕| 国产亚洲精品久久久久秋霞| 久久国产V一级毛多内射| 亚洲AV日韩精品久久久久| 精品人妻伦九区久久AAA片69| 久久综合给合久久国产免费| 中文字幕精品久久| 国产精品内射久久久久欢欢| 2021久久国自产拍精品| 久久精品国产网红主播| 久久综合久久自在自线精品自 | 18岁日韩内射颜射午夜久久成人| 青青草原综合久久| 97久久精品无码一区二区天美| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 一本一道久久a久久精品综合| 国产叼嘿久久精品久久| 久久精品国产亚洲综合色| 丁香狠狠色婷婷久久综合| 久久本道伊人久久| 久久精品免费一区二区三区| 久久电影网一区| 久久综合综合久久狠狠狠97色88| 久久综合九色综合精品|