qwidget美化_Qt美化界面的心得整理

最近在美化QT,一直对纯代码编写和美化界面能力拙急。网上搜了很多很多资料,但由于那个庞大的工程还没完成,先将网上的资料整理一下,有一些没用到的,留着以后看。等我的界面美化完之后再po上来~

/**********************************转载分割线**********************************/

Qt 的一些心得

本文来自:http://blog.csdn.net/lpt19832003/archive/2010/03/15/5381095.aspx

一. 背景刷成黑色,前景色设为白色。

方法一、paltette方式,经测试,该方法不会影响到其他控件,推荐使用

点击(此处)折叠或打开

QPalette bgpal = palette();

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

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

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

方法二、stylesheet方式

影响子控件的方法是:

点击(此处)折叠或打开

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

不影响子控件的方法是:

点击(此处)折叠或打开

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

点击(此处)折叠或打开

this->setObjectName("pw");// 设置对象句,相当于css里的id

this->setStyleSheet("#pw {border-image: url(:/new/prefix1/Pic/54.png);}");// 设置id对应元素的背景色

二. 圆角控件 用stylesheet方式

点击(此处)折叠或打开

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

三. 圆角窗口

点击(此处)折叠或打开

RoundRectWin::RoundRectWin()

{

QPalette p = palette();

QPixmap img("roundrect.png");

QBitmap mask("roundrect_mask.png");

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

setPalette(p);

setMask(mask);

resize(img.size());

//setWindowFlags(Qt::FramelessWindowHint);//这句会去掉标题栏 } 注意:mask的图多余部分设为白色

}

四. 半透明窗口

1.窗口整体透明,但是窗体上的控件不透明。 通过设置窗体的背景色来实现,将背景色设置为全透。

点击(此处)折叠或打开

QPalette pal = palette();

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

setPalette(pal);

注:窗体标题栏不透明,窗体客户区上的控件不透明,QLabel控件只是字显示,控件背景色透明; 窗体客户区完全透明。

另外从网上看到的方法:

点击(此处)折叠或打开

setAttribute(Qt::WA_TranslucentBackground, true);

试验的结果是类似于上面的方法,但有时候窗体会被一些杂色斑点填充,未找到原因。

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

点击(此处)折叠或打开

setWindowOpacity(0.7);

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

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

在Paint事件中使用Clear模式绘图。

点击(此处)折叠或打开

void TestWindow::paintEvent( QPaintEvent* )

{

QPainter p(this);

p.setCompositionMode( QPainter::CompositionMode_Clear );

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

}

试验效果:绘制区域全透明。如果绘制区域有控件不会影响控件。

以上实验均是基于Directfb的Qte测试。在Linux下及Windows下效果会略有不同。

比如在Windows下第3个实验,绘制区域就是一个黑窟窿,如果Window本身半透,则是Window下面的内容加上半透效果,不是全透明效果。

五. 控制QPixmap的alpha

点击(此处)折叠或打开

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

QPainter p(&temp);

p.setCompositionMode(QPainter::CompositionMode_Source);

p.drawPixmap(0, 0, pixmapTop);

p.setCompositionMode(QPainter::CompositionMode_DestinationIn);

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

ui->label->setPixmap(temp);

六. layout 的边界

点击(此处)折叠或打开

layout->setMargin (0);

终于把qt半透明搞定了

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

点击(此处)折叠或打开

QFrame *frame = new QFrame();

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

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

frame->hide();

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

QImage image = pixmap.convertToImage();

//image.convertDepth( 32 );

image.setAlphaBuffer( true );

QImage bgImage = grabPixmap.convertToImage();

//bgImage.convertDepth( 32 );

bgImage.setAlphaBuffer( true );

double k = 0.5;

QRgb *rgbpos1 = image.colorTable();

QRgb *rgbpos2 = bgImage.colorTable();

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

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

{

#if 1

uint rgb1 = image.pixel( x, y );

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

unsigned int red = qRed(rgb1);

unsigned int green = qGreen(rgb1);

unsigned int blue = qBlue(rgb1);

unsigned int bgred = qRed(rgb2);

unsigned int bggreen = qGreen(rgb2);

unsigned int bgblue = qBlue(rgb2);

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

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

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

//red = red << 4;

//green = green << 4;

//blue = blue << 4;

#endif

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

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

//image.setPixel( x, y, myrgb );

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

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

}

qWarning("%d %d", image.depth(), bgImage.depth());

grabPixmap.convertFromImage( image );

frame->setBackgroundPixmap( grabPixmap );

frame->show();

#endif

将窗口嵌入桌面

ps:这儿用上了前面一文提到的函数findDesktopIconWnd()。

本文来自:一、将Qt窗口嵌入到桌面中。

声明一个最简单的类:

点击(此处)折叠或打开

class Dialog : public QDialog

{

Q_OBJECT

public:

Dialog(QWidget *parent = 0);

~Dialog();

}

函数实现:

点击(此处)折叠或打开

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

{

//创建个LineEdit用来测试焦点

QLineEdit* le = new QLineEdit(this);

}

Dialog::~Dialog()

{

}

主函数:

点击(此处)折叠或打开

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

{

QApplication a(argc, argv);

Dialog w;

HWND desktopHwnd = findDesktopIconWnd();

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

w.show();

return a.exec();

}

有个窗口嵌入了桌面。按win+D组合键可以看到此窗口在桌面上。运行效果:

二、让窗口全透明:

2.1最容易想到的就是setWindowOpacity()函数了。点击(此处)折叠或打开

w.setWindowOpacity(0.5);

运行:结果杯具了,此函数完全无效,因为其父窗口特殊,这个函数内部使用的系统窗口标志不被支持。

2.2

点击(此处)折叠或打开

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

全透明ok。如果其父窗口为空的话,透明的地方会成为黑块。运行效果:

三、让窗口半透明

3.1

点击(此处)折叠或打开

w.setAttribute(Qt::WA_TranslucentBackground, true) + 背景调色板运行效果仍然是全透明,因为TranslucentBackground为true,根本不画背景。

3.2单纯的背景调色板:

点击(此处)折叠或打开

QPalette pal = w.palette();

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

w.setPalette(pal);

w.setAutoFillBackground(true);

运行效果出现了半透明:

但是还没大功告成,不停点击桌面,再点击这个窗口,会发现这个窗口越来越不透明,直至完全不透明了。不知道是不是qt的bug。

ps:加一句 w.setAttribute(Qt::WA_OpaquePaintEvent,true); 窗口就能够一直保持这个效果了。即这个方案可行。

pps:此方案在XP也是黑色底块。

3.3转战paintEvent()点击(此处)折叠或打开

void Dialog::paintEvent(QPaintEvent *e)

{

QPainter p(this);

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

}

用一个带有alpha值的颜色填充背景,运行效果发现颜色确实有alpha值,但是桌面的内容透不过来。

3.4setAttribute(Qt::WA_TranslucentBackground, true) + paintEvent()

得到了设想中的效果。运行效果:

最终的主函数代码:

点击(此处)折叠或打开

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

{

QApplication a(argc, argv);

Dialog w;

HWND desktopHwnd = findDesktopIconWnd();

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

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

w.show();

return a.exec();

}

最终的dialog实现代码:

点击(此处)折叠或打开

Dialog::Dialog(QWidget *parent) : QWidget(parent)

{

//创建个LineEdit用来测试焦点

QLineEdit* le = new QLineEdit(this);

}

Dialog::~Dialog()

{

}

void Dialog::paintEvent(QPaintEvent *e)

{

QPainter p(this);

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

}

PS:

经测试此代码在XP运行不正常。窗口成为黑色背景块。只能是颜色半透明了。

还有就是图标会被盖住。只能把w.setAttribute(Qt::WA_TranslucentBackground,true);注释掉,有半透明颜色,无法看到桌面。

首先给出在QT中进行标题栏自绘的方法(两个网址给出了方法和参考代码)

其次,做一点关于在windows平台下将顶级窗口透明化的说明

1.在4.5版本以前,要实现Top level窗口的透明化,需要使用setMask方法,该方法有两个重载,一个是QRegion定义一个区域表明这一区域是要被绘制的区域,在该区域以外的地方是不需要绘制的.第二个重载版本是需要一个QBitmap,这个QBitmap只需要一张单色位图就可以了(另外,一张带有透明效果的PNG图片被读入QPixmap中以后,可以使用函数mask()返回一张与原图对应的单色位图,这很方便实际使用),白色部分表示是不透明要被绘制的区域,黑色部分表示该区域不应该被绘制(能实现透明的效果).

2.4.5版本发行以后,可以设置窗口属性Qt::WA_TranslucentBackground来设定该窗口透明显示,但是有一个问题,就是如果该窗口是个top level窗口,就会有标题栏(title bar), 在windows平台下,如果不把这个标题栏去掉(设置Qt::FramelessWindowHint 标志位就会去掉标题栏),那么将不会是透明效果,而是背景为全黑(我的实验结果是这样)

qt 设置子控件为半透明和背景色问题

本文来自:在子widget的构造函数里添加如下几句:

点击(此处)折叠或打开

QPalette myPalette;

QColor myColor(0,0,0);

myColor.setAlphaF(0.2);

myPalette.setBrush(backgroundRole(),myColor);

this->setPalette(myPalette);

this->setAutoFillBackground(true);

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

改子widget的背景色 :

点击(此处)折叠或打开

QPalette myPalette;

QColor myColor(0,0,0);

myPalette.setBrush(backgroundRole(),myColor);

this->setPalette(myPalette);

this->setAutoFillBackground(true);//这句很关键,缺少的话,背景色修改不成功

修改alpha值:

点击(此处)折叠或打开

myColor.setAlphaF(0.2);//通过设置alpha值来改变透明度

qt 窗口圆角问题

本文来自:

最近在用qss做界面美化的工作,发现一个问题就是qss不能对顶级窗口设置边角圆弧,于是得另辟蹊径。据网上搜索可得到的方法我实现了三种:

1.

点击(此处)折叠或打开

setWindowFlags(Qt::FramelessWindowHint);

QBitmap bmp(this->size());

bmp.fill();

QPainter p(&bmp);

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

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

p.setRenderHint(QPainter::Antialiasing);

//p.drawRoundedRect(bmp.rect(), 20, 20); //四个角都是圆弧

//只要上边角圆弧

int arcR = 20;

QRect rect = this->rect();

QPainterPath path;

//逆时针

path.moveTo(arcR, 0);

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

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

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

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

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

path.lineTo(arcR, 0);

p.drawPath(path);

p.fillPath(path, QBrush(Qt::Red)); //arm和windows平台没有这行代码将显示一个透明的空空的框

setMask(bmp);

2.

构造函数中

点击(此处)折叠或打开

setAttribute(Qt::WA_TranslucentBackground, true);

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

| Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint);

重载paintEvent

点击(此处)折叠或打开

QPainter p(this);

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

3.背景图片

点击(此处)折叠或打开

QPixmap pixmap(":/images/*.png");

setMask(pixmap.mask());

QPalette palette;

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

setPalette(palette);

resize( pixmap.size() );

setMask(pixmap.mask());

同样的一个setMask();在三个不同的平台上区别倒是很大,很是奇怪。

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页