中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

QT透明的經(jīng)驗匯編

最近在美化QT,一直對純代碼編寫和美化界面能力拙急。網(wǎng)上搜了很多很多資料,但由于那個龐大的工程還沒完成,先將網(wǎng)上的資料整理一下,有一些沒用到的,留著以后看。等我的界面美化完之后再po上來~
/**********************************轉(zhuǎn)載分割線**********************************/
Qt 的一些心得
本文來自:http://blog.csdn.net/lpt19832003/archive/2010/03/15/5381095.aspx

為??诘鹊貐^(qū)用戶提供了全套網(wǎng)頁設計制作服務,及海口網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都做網(wǎng)站、成都網(wǎng)站制作、海口網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!


一. 背景刷成黑色,前景色設為白色。 
方法一、paltette方式,經(jīng)測試,該方法不會影響到其他控件,推薦使用

點擊(此處)折疊或打開

  1. QPalette bgpal = palette();

  2. bgpal.setColor (QPalette::Background, QColor (0, 0 , 0, 255));

  3. //bgpal.setColor (QPalette::Background, Qt::transparent);

  4. bgpal.setColor (QPalette::Foreground, QColor (255,255,255,255)); setPalette (bgpal);


方法二、stylesheet方式 
影響子控件的方法是:

點擊(此處)折疊或打開

  1. setStyleSheet ("background-color: rgb(0,0,0);color: rgb(255,255,255);");

不影響子控件的方法是:

點擊(此處)折疊或打開

  1. setStyleSheet ("venus--TitleBar {background-color: rgb(0,0,0);color: rgb(255,255,255);}");


點擊(此處)折疊或打開

  1. this->setObjectName("pw");// 設置對象句,相當于css里的id

  2. this->setStyleSheet("#pw {border-p_w_picpath: url(:/new/prefix1/Pic/54.png);}");// 設置id對應元素的背景色


二. 圓角控件 用stylesheet方式

點擊(此處)折疊或打開

  1. setStyleSheet ("border:2px groove gray;border-radius:10px;padding:2px 4px;");


三. 圓角窗口

點擊(此處)折疊或打開

  1. RoundRectWin::RoundRectWin() 

  2.     QPalette p = palette(); 

  3.    QPixmap img("roundrect.png");

  4.     QBitmap mask("roundrect_mask.png");

  5.     p.setBrush(QPalette::Window, QBrush(img));

  6.     setPalette(p);

  7.     setMask(mask);

  8.     resize(img.size());

  9.     //setWindowFlags(Qt::FramelessWindowHint);//這句會去掉標題欄 } 注意:mask的圖多余部分設為白色

  10.  }


四. 半透明窗口

1.窗口整體透明,但是窗體上的控件不透明。 通過設置窗體的背景色來實現(xiàn),將背景色設置為全透。

點擊(此處)折疊或打開

  1. QPalette pal = palette(); 

  2. pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00)); 

  3. setPalette(pal);

  注:窗體標題欄不透明,窗體客戶區(qū)上的控件不透明,QLabel控件只是字顯示,控件背景色透明; 窗體客戶區(qū)完全透明。
  另外從網(wǎng)上看到的方法: 

點擊(此處)折疊或打開

  1. setAttribute(Qt::WA_TranslucentBackground, true);

試驗的結(jié)果是類似于上面的方法,但有時候窗體會被一些雜色斑點填充,未找到原因。


2.窗口及其上面的控件都半透明:

點擊(此處)折疊或打開

  1. setWindowOpacity(0.7);

試驗效果:窗口及控件都半透明。注意不能夠setWindowFlags(Qt::FramelessWindowHint);要不就不起作用


3.窗口整體不透明,局部透明:

在Paint事件中使用Clear模式繪圖。

點擊(此處)折疊或打開

  1. void TestWindow::paintEvent( QPaintEvent* ) 

  2.    QPainter p(this); 

  3.     p.setCompositionMode( QPainter::CompositionMode_Clear ); 

  4.     p.fillRect( 10, 10, 300, 300, Qt::SolidPattern ); 

  5. }

試驗效果:繪制區(qū)域全透明。如果繪制區(qū)域有控件不會影響控件。

以上實驗均是基于Directfb的Qte測試。在Linux下及Windows下效果會略有不同。 
比如在Windows下第3個實驗,繪制區(qū)域就是一個黑窟窿,如果Window本身半透,則是Window下面的內(nèi)容加上半透效果,不是全透明效果。

 

五. 控制QPixmap的alpha

點擊(此處)折疊或打開

  1.    QPixmap temp(pixmapTop.size()); temp.fill(Qt::transparent);

  2.     QPainter p(&temp);

  3.     p.setCompositionMode(QPainter::CompositionMode_Source);

  4.     p.drawPixmap(0, 0, pixmapTop);

  5.     p.setCompositionMode(QPainter::CompositionMode_DestinationIn);

  6.     p.fillRect(temp.rect(), QColor(0, 0, 0, alpha)); //--lable顯示前景圖片 ui->label->setScaledContents(true);

  7.     ui->label->setPixmap(temp);

六. layout 的邊界

點擊(此處)折疊或打開

  1. layout->setMargin (0);


終于把qt半透明搞定了

本文來自:http://hi.baidu.com/sszllx/blog/item/ab833a59ea98622f2934f001.html

點擊(此處)折疊或打開

  1. QFrame *frame = new QFrame();

  2. QPixmap grabPixmap = QPixmap::grabWindow( frame->winId(), 20, 0, 100, 100 );

  3. frame->setGeometry( 20, 20, 100, 100 );

  4. frame->hide();

  5. QPixmap pixmap = Resource::loadPixmap( "qpelogo" );

  6. QImage p_w_picpath = pixmap.convertToImage();

  7. //p_w_picpath.convertDepth( 32 );

  8. p_w_picpath.setAlphaBuffer( true );

  9. QImage bgImage = grabPixmap.convertToImage();

  10. //bgImage.convertDepth( 32 );

  11.     bgImage.setAlphaBuffer( true );

  12.     double k = 0.5;

  13. QRgb *rgbpos1 = p_w_picpath.colorTable();

  14. QRgb *rgbpos2 = bgImage.colorTable();

  15. for( int y = 0; y < 80; y++ )

  16.    for( int x = 0; x < 80; x++ )

  17.     {

  18. #if 1

  19.        uint rgb1 = p_w_picpath.pixel( x, y );

  20.      uint rgb2 = bgImage.pixel( x, y );

  21.      unsigned int red = qRed(rgb1);

  22.      unsigned int green = qGreen(rgb1);

  23.      unsigned int blue = qBlue(rgb1);

  24.      unsigned int bgred = qRed(rgb2);

  25.      unsigned int bggreen = qGreen(rgb2);

  26.      unsigned int bgblue = qBlue(rgb2);

  27.      red = k * red + ( 1 - k ) * bgred;

  28.      green = k * green + ( 1 - k ) * bggreen;

  29.      blue = k * blue + ( 1 - k ) * bgblue;

  30.      //red = red << 4;

  31.      //green = green << 4;

  32.      //blue = blue << 4;

  33. #endif

  34.      //color = QColor( red, green, blue );

  35.      //unsigned int myrgb = color.rgb();

  36.      //p_w_picpath.setPixel( x, y, myrgb );

  37.      uint *p = (uint *)p_w_picpath.scanLine(y) + x;

  38.                 *p = qRgb( red, green, blue );

  39.     

  40.     }

  41. qWarning("%d %d", p_w_picpath.depth(), bgImage.depth());

  42. grabPixmap.convertFromImage( p_w_picpath );

  43. frame->setBackgroundPixmap( grabPixmap );

  44. frame->show();

  45. #endif


將窗口嵌入桌面

ps:這兒用上了前面一文提到的函數(shù)findDesktopIconWnd()。
本文來自:http://mypyg.blog.51cto.com/820446/263369

一、將Qt窗口嵌入到桌面中。
聲明一個最簡單的類:

點擊(此處)折疊或打開

  1. class Dialog : public QDialog

  2. {

  3.         Q_OBJECT

  4. public:

  5.         Dialog(QWidget *parent = 0);

  6.         ~Dialog();

  7. }

函數(shù)實現(xiàn):

點擊(此處)折疊或打開

  1. Dialog::Dialog(QWidget *parent) : QDialog(parent)

  2. {

  3.         //創(chuàng)建個LineEdit用來測試焦點

  4.         QLineEdit* le = new QLineEdit(this);

  5. }

  6. Dialog::~Dialog()

  7. {

  8. }

主函數(shù):

點擊(此處)折疊或打開

  1. int main(int argc, char *argv[])

  2. {

  3.         QApplication a(argc, argv);

  4.         Dialog w;

  5.         HWND desktopHwnd = findDesktopIconWnd();

  6.         if(desktopHwnd) SetParent(w.winId(), desktopHwnd);

  7.         w.show();

  8.         return a.exec();

  9. }

有個窗口嵌入了桌面。按win+D組合鍵可以看到此窗口在桌面上。運行效果:
QT透明的經(jīng)驗匯編

二、讓窗口全透明:
2.1最容易想到的就是setWindowOpacity()函數(shù)了。

點擊(此處)折疊或打開

  1. w.setWindowOpacity(0.5);

運行:結(jié)果杯具了,此函數(shù)完全無效,因為其父窗口特殊,這個函數(shù)內(nèi)部使用的系統(tǒng)窗口標志不被支持。
2.2

點擊(此處)折疊或打開

  1. w.setAttribute(Qt::WA_TranslucentBackground, true);

全透明ok。如果其父窗口為空的話,透明的地方會成為黑塊。運行效果:

QT透明的經(jīng)驗匯編

三、讓窗口半透明
3.1

點擊(此處)折疊或打開

  1. w.setAttribute(Qt::WA_TranslucentBackground, true) + 背景調(diào)色板

運行效果仍然是全透明,因為TranslucentBackground為true,根本不畫背景。
3.2單純的背景調(diào)色板:

點擊(此處)折疊或打開

  1. QPalette pal = w.palette();

  2. pal.setColor(QPalette::Background, QColor(100,100,100,50));

  3. w.setPalette(pal);

  4. w.setAutoFillBackground(true);

運行效果出現(xiàn)了半透明:
QT透明的經(jīng)驗匯編
但是還沒大功告成,不停點擊桌面,再點擊這個窗口,會發(fā)現(xiàn)這個窗口越來越不透明,直至完全不透明了。不知道是不是qt的bug。
ps:加一句 w.setAttribute(Qt::WA_OpaquePaintEvent,true); 窗口就能夠一直保持這個效果了。即這個方案可行。
pps:此方案在XP也是黑色底塊。
3.3轉(zhuǎn)戰(zhàn)paintEvent()

點擊(此處)折疊或打開

  1. void Dialog::paintEvent(QPaintEvent *e)

  2. {

  3.         QPainter p(this);

  4.         p.fillRect(rect(), QColor(0,0xff,0,30));

  5. }

用一個帶有alpha值的顏色填充背景,運行效果發(fā)現(xiàn)顏色確實有alpha值,但是桌面的內(nèi)容透不過來。
3.4setAttribute(Qt::WA_TranslucentBackground, true) + paintEvent()
得到了設想中的效果。運行效果:
QT透明的經(jīng)驗匯編

最終的主函數(shù)代碼:

點擊(此處)折疊或打開

  1. int main(int argc, char *argv[])

  2. {

  3.         QApplication a(argc, argv);

  4.         Dialog w;

  5.         HWND desktopHwnd = findDesktopIconWnd();

  6.         if(desktopHwnd) SetParent(w.winId(), desktopHwnd);

  7.         w.setAttribute(Qt::WA_TranslucentBackground, true);

  8.         w.show();

  9.         return a.exec();

  10. }

最終的dialog實現(xiàn)代碼:

點擊(此處)折疊或打開

  1. Dialog::Dialog(QWidget *parent) : QWidget(parent)

  2. {

  3.         //創(chuàng)建個LineEdit用來測試焦點

  4.         QLineEdit* le = new QLineEdit(this);

  5. }

  6. Dialog::~Dialog()

  7. {

  8. }

  9. void Dialog::paintEvent(QPaintEvent *e)

  10. {

  11.         QPainter p(this);

  12.         p.fillRect(rect(), QColor(0,0xff,0,30));

  13. }

PS:
經(jīng)測試此代碼在XP運行不正常。窗口成為黑色背景塊。只能是顏色半透明了。
還有就是圖標會被蓋住。只能把w.setAttribute(Qt::WA_TranslucentBackground, true);注釋掉,有半透明顏色,無法看到桌面。

在QT中自繪控件的方法說明
本文來自:http://blog.csdn.net/dotboy/archive/2009/06/22/4287805.aspx

首先給出在QT中進行標題欄自繪的方法(兩個網(wǎng)址給出了方法和參考代碼)

litterflybug的專欄 ::http://blog.csdn.net/litterflybug/archive/2009/05/07/4157482.aspx

QT官方FAQ: http://www.qtsoftware.com/developer/faqs/faq.2007-04-25.2011048382

其次,做一點關(guān)于在windows平臺下將頂級窗口透明化的說明

1.在4.5版本以前,要實現(xiàn)Top level窗口的透明化,需要使用setMask方法,該方法有兩個重載,一個是QRegion定義一個區(qū)域表明這一區(qū)域是要被繪制的區(qū)域,在該區(qū)域以外的地方是不需要繪制的.第二個重載版本是需要一個QBitmap,這個QBitmap只需要一張單色位圖就可以了(另外,一張帶有透明效果的PNG圖片被讀入QPixmap中以后,可以使用函數(shù)mask()返回一張與原圖對應的單色位圖,這很方便實際使用),白色部分表示是不透明要被繪制的區(qū)域,黑色部分表示該區(qū)域不應該被繪制(能實現(xiàn)透明的效果).

2.4.5版本發(fā)行以后,可以設置窗口屬性Qt::WA_TranslucentBackground來設定該窗口透明顯示,但是有一個問題,就是如果該窗口是個top level窗口,就會有標題欄(title bar), 在windows平臺下,如果不把這個標題欄去掉(設置Qt::FramelessWindowHint 標志位就會去掉標題欄),那么將不會是透明效果,而是背景為全黑(我的實驗結(jié)果是這樣)


qt 設置子控件為半透明和背景色問題

本文來自:http://bbs.csdn.net/topics/370078118

在子widget的構(gòu)造函數(shù)里添加如下幾句:

點擊(此處)折疊或打開

  1. QPalette myPalette;

  2. QColor myColor(0,0,0);

  3. myColor.setAlphaF(0.2);

  4. myPalette.setBrush(backgroundRole(),myColor);

  5. this->setPalette(myPalette);

  6. this->setAutoFillBackground(true);

原理是:改子widget的背景色+修改alpha值(設置半透明)

改子widget的背景色 :

點擊(此處)折疊或打開

  1. QPalette myPalette;

  2. QColor myColor(0,0,0);

  3. myPalette.setBrush(backgroundRole(),myColor);

  4. this->setPalette(myPalette);

  5. this->setAutoFillBackground(true);//這句很關(guān)鍵,缺少的話,背景色修改不成功


修改alpha值:

點擊(此處)折疊或打開

  1. myColor.setAlphaF(0.2);//通過設置alpha值來改變透明度


qt 窗口圓角問題
本文來自:http://blog.csdn.net/fariel_zhang/article/details/6315463

最近在用qss做界面美化的工作,發(fā)現(xiàn)一個問題就是qss不能對頂級窗口設置邊角圓弧,于是得另辟蹊徑。據(jù)網(wǎng)上搜索可得到的方法我實現(xiàn)了三種:

1.

點擊(此處)折疊或打開

  1. setWindowFlags(Qt::FramelessWindowHint); 

  2.     QBitmap bmp(this->size()); 

  3.     bmp.fill(); 

  4.     QPainter p(&bmp); 

  5. // p.setPen(Qt::NoPen); 

  6. // p.setBrush(Qt::black); 

  7.     p.setRenderHint(QPainter::Antialiasing); 

  8.     //p.drawRoundedRect(bmp.rect(), 20, 20); //四個角都是圓弧 

  9.     //只要上邊角圓弧 

  10.     int arcR = 20; 

  11.     QRect rect = this->rect(); 

  12.     QPainterPath path; 

  13.     //逆時針 

  14.     path.moveTo(arcR, 0); 

  15.     path.arcTo(0, 0, arcR * 2, arcR * 2, 90.0f, 90.0f); 

  16.     path.lineTo(0, rect.height()); 

  17.     path.lineTo(rect.width(), rect.height()); 

  18.     path.lineTo(rect.width(), arcR); 

  19.     path.arcTo(rect.width() - arcR * 2, 0, arcR * 2, arcR * 2, 0.0f, 90.0f); 

  20.     path.lineTo(arcR, 0); 

  21.     p.drawPath(path); 

  22.     p.fillPath(path, QBrush(Qt::Red)); //arm和windows平臺沒有這行代碼將顯示一個透明的空空的框 

  23.     setMask(bmp);

2.

構(gòu)造函數(shù)中

點擊(此處)折疊或打開

  1.     setAttribute(Qt::WA_TranslucentBackground, true); 

  2.     setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint 

  3.                    | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint);

重載paintEvent

點擊(此處)折疊或打開

  1. QPainter p(this); 

  2. p.drawRoundedRect(0, 0, width() - 1, height() - 1, 20, 20);


3.背景圖片

點擊(此處)折疊或打開

  1. QPixmap pixmap(":/p_w_picpaths/*.png"); 

  2.   setMask(pixmap.mask()); 

  3. QPalette palette; 

  4. palette.setBrush(QPalette::Background, QBrush( pixmap ) ); 

  5. setPalette(palette); 

  6. resize( pixmap.size() ); 

  7. setMask(pixmap.mask());

同樣的一個setMask();在三個不同的平臺上區(qū)別倒是很大,很是奇怪。

當前標題:QT透明的經(jīng)驗匯編
轉(zhuǎn)載源于:http://www.rwnh.cn/article34/gcgepe.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作外貿(mào)網(wǎng)站建設、品牌網(wǎng)站建設、網(wǎng)頁設計公司響應式網(wǎng)站、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設計公司
敦煌市| 称多县| 通州区| 平泉县| 南溪县| 绥芬河市| 蓬安县| 梅河口市| 阿克陶县| 荔波县| 全南县| 阿鲁科尔沁旗| 景德镇市| 石林| 疏勒县| 边坝县| 阿瓦提县| 芦溪县| 应城市| 三河市| 墨竹工卡县| 明溪县| 旌德县| 通山县| 视频| 将乐县| 贡觉县| 沁水县| 临漳县| 大厂| 寿光市| 广平县| 普洱| 施秉县| 两当县| 柘城县| 广宁县| 洛南县| 福海县| 通许县| 涟源市|