• <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>

            逛奔的蝸牛

            我不聰明,但我會很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::

            Skin(表皮) 是制作比較酷的軟件界面的有利工具. 一個軟件可以同時使用多種Skin 以取得不同的外觀, 使同一個軟件有截然不同的風格. 用戶可以根據(jù)自己的喜好選擇 不同的風格. 本節(jié)介紹使用 Qt 制作 Skin 的方法.

            軟件界面的風格變化可以通過兩種機制完成,一種是通過設(shè)置主題(Themes),它使用 界面庫本身所具有的對界面組件(Components)的控制能力切換顯示風格;另外一種是 通過提供不同系列的圖片來切換顯示界面,即這里所講的 Skin。

            制作表皮有幾個重要的因素值得考慮:

            1. 使用無邊界的窗口
            在 XWindow 下,無邊界的窗口是指不受窗口管理器管理的邊界不規(guī)則的窗口。由于不受窗口管理器管理管理,所以軟件窗口界面沒有附加的標題條(Title Bar)等。 在Qt中,建立無邊界窗口的最簡單的方法 是設(shè)置 QWidget 的 WFlags 的值是 WStyle_NoBorder。它定義在 qnamespace.h 中。不規(guī)則窗口的特點則要求對整個 窗口使用圖像掩碼。使用 X 窗口形狀的擴展(X Shape Extension)來達到要求。在 Qt 中可以直接使用,


            QBitmap bm;
            bm = *(Pixmaps[MASK]);
            setMask(bm);
            setBackgroundPixmap(*Pixmaps[BACKGROUND]);


            2. 窗口的移動
            由于上述窗口不受窗口管理器的管理的特性,所以移動窗口需要特殊處理,一般的 方法是截取根Widget的鼠標按鈕事件,自己處理鼠標點擊和移動的事件。


            void SkinDemo::mouseMoveEvent(QMouseEvent *e)
            {
            QPoint newpos = e->globalPos();
            QPoint upleft = pos0 + newpos - last;
            move(upleft);
            }

            void SkinDemo::mousePressEvent(QMouseEvent *e)
            {
            last = e->globalPos();
            pos0 = e->globalPos() - e->pos();
            }


            這里我們?nèi)〉玫氖髽宋恢檬墙^對位置,即相對于根窗口的位置,同時也記錄下窗口 左上角的位置,當鼠標移動時,取得新的絕對位置,則窗口左上角 的新位置應(yīng)該 是原來位置與鼠標移動的位置之差。

            3. 按鈕的制作
            在 例子( qt-skin-example.tar.gz) 中,我們重新定義了鼠標按下和鼠標移動的事件處理 函數(shù),并且含有按鈕的所有信息,主工作區(qū)的所有信息等。主工作區(qū)的信息是它的位置和尺寸,主窗口的信息是它所使用的背景圖片和圖片的掩碼(用來制造不規(guī)則 窗口),所以整個主窗口的大小可以由圖片的尺寸來決定。幾個按鈕的信息包含它們的 位置,它們的大小由圖片的大小來決定。
            對于表皮中的圖像按鈕, 設(shè)置它的父類是 QButton,這種按鈕由兩幅圖片構(gòu)成,一幅圖片是正常狀態(tài)(Normal),一幅圖片是按鈕按下時的狀態(tài)(Activated)。有時也可以設(shè)置成四 種狀態(tài),即增加禁止狀態(tài)(Disabled)和鼠標指針進入時的狀態(tài) (Hovered)。Qt3 的手工代碼實現(xiàn):

            CODE:
            #include <qapplication.h>
            #include <qwidget.h>
            #include <qpixmap.h>
            #include <qbitmap.h>
            #include <qpoint.h>

            class myclass:public QWidget
            {
                public:
                    myclass();
                protected:
                    void mouseMoveEvent(QMouseEvent *e);
                    void mousePressEvent(QMouseEvent *e);
                private:
                    QPixmap *pixmap;
                    QBitmap *bitmap;
                    QPoint last,pos0;
            };

            myclass::myclass()
            {
                setGeometry(0,0,120,120);
                pixmap=new QPixmap("/doc/test/a/tmp.png");
                bitmap=new QBitmap("/doc/test/a/mask.png");
                setPaletteBackgroundPixmap(*pixmap);
                setMask(*bitmap);
            }
            void myclass::mouseMoveEvent(QMouseEvent *e)
            {
                if(e->state()==LeftButton)
                {
                QPoint newpos = e->globalPos();
                QPoint upleft = pos0 + newpos - last;
                move(upleft);
                }
            }

            void myclass::mousePressEvent(QMouseEvent *e)
            {
                last = e->globalPos();
                pos0 = e->globalPos() - e->pos();
            }
                     

            int main(int argc,char *argv[])
            {
                QApplication a(argc,argv);
                myclass w;
                a.setMainWidget(&w);
                w.show();
                return a.exec();
            }

            posted on 2009-05-20 13:58 逛奔的蝸牛 閱讀(889) 評論(0)  編輯 收藏 引用 所屬分類: Qt
            国产精品国色综合久久| av无码久久久久久不卡网站| 高清免费久久午夜精品| 欧美一区二区三区久久综| 久久精品国产亚洲av麻豆色欲| 久久国产精品无码HDAV| 久久综合久久综合久久| 久久久久亚洲av毛片大| 久久亚洲精品国产亚洲老地址| 久久频这里精品99香蕉久| 亚洲熟妇无码另类久久久| 久久精品成人国产午夜| 国产亚洲精久久久久久无码77777| 少妇熟女久久综合网色欲| 99久久99久久精品国产| 久久人人爽爽爽人久久久| 国产高清美女一级a毛片久久w| 久久国产色AV免费看| 国产精品久久久久一区二区三区| 99久久99久久精品国产片果冻 | 99国产欧美精品久久久蜜芽| 亚洲精品tv久久久久久久久久| 女人香蕉久久**毛片精品| 777午夜精品久久av蜜臀| 国产一区二区三精品久久久无广告 | 99久久免费国产精精品| 亚洲人成网站999久久久综合| 久久精品国产99国产电影网 | 久久这里都是精品| 久久精品国产99久久久香蕉| 久久国产精品成人影院| 亚洲国产精品久久电影欧美| 一本一本久久a久久精品综合麻豆| 亚洲国产精久久久久久久| 国产精品99精品久久免费| 亚洲AV无码成人网站久久精品大| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久精品国产99久久香蕉| 久久99国产精品久久99果冻传媒| 国产aⅴ激情无码久久| 久久夜色精品国产亚洲|