自学QT之不规则窗口和不规则按钮(亲测)

看到很多软件,尤其是游戏软件,有一些炫酷的界面,一直在想,他们究竟是怎么做到的呢?那明明是一张图片啊。

天下有我大QT做不到的事情吗?当然没有!

现在开始:请准备一张带有透明区域的png图片哦。还有就是头文件请加入#include<QBitmap>,看到后面你就明白啦,不然会报错的哦。

首先来看自定义不规则窗口的代码吧:


  
  
  1. Widget::Widget(QWidget *parent)
  2. : QWidget(parent)
  3. {
  4. this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowMinimizeButtonHint);
  5. this->setAttribute(Qt::WA_TranslucentBackground);
  6. pix.load( ":/new/prefix1/201409091359143092.png");
  7. this->resize(pix.size());
  8. }
  9. void Widget::paintEvent(QPaintEvent *e)
  10. {
  11. QPainter painter(this);
  12. painter.drawPixmap( 0, 0,pix);
  13. }

这里一定要把绘制写到paintevent里面,构造函数也一定要调用resize。

然后看看界面吧。

这界面够复杂了吧?还有谁!你可以在上面添加控件哦。这里绝不仅仅是显示图片,仔细研究可以看出,窗体是这个可见区域,其他不可见的,并不是窗体,这才是真正的不规则。

当然,因为去掉了标题栏,所以窗体的移动事件,需要自己重写,貌似也不难。

还有一种

或许你并不喜欢这种方式,你就想要setstylesheet方式,那么请看如下代码哦。


  
  
  1. #include <QStyleOption>
  2. Widget::Widget(QWidget *parent)
  3. : QWidget(parent)
  4. {
  5. this->resize( 400, 400);
  6. setWindowOpacity( 1);
  7. setWindowFlags(Qt::FramelessWindowHint);
  8. setAttribute(Qt::WA_TranslucentBackground);
  9. this->setStyleSheet( "background-image: url(:/new/prefix1/201409091359143092.png)");
  10. }
  11. void Widget::paintEvent(QPaintEvent *e)
  12. {
  13. QStyleOption opt;
  14. opt.initFrom( this);
  15. QPainter p(this);
  16. style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
  17. QWidget::paintEvent(e);
  18. }

这样也是可以的。


接下来是不规则按钮


  
  
  1. QPixmap pix;
  2. pix.load( ":/new/prefix1/111.png");
  3. ui->pushButton->setFixedSize(pix.size());
  4. ui->pushButton->setMask(pix.mask());
  5. ui->pushButton->setStyleSheet( "background-image: url(:/new/prefix1/111.png)");
这段代码要说一下原理。mask其实获取的是alpha通道的信息,然后显示,这就导致一个问题,图片在显示的的时候,会变色了,所以我们要给这个按钮指定一下背景,背景和它一起重叠,就正常显示了。话说至于那个窗体为什么不需要这样做,这个没有研究过……

效果图:

这个按钮够奇葩了吧,四周可以单击,中间不可以单击。不过呢,你的按钮图片不能过于复杂,比如上面窗体的那个图就不行,会出现卡顿或者不显示的问题。

好了,结束。

说到这里突然想起来setmask函数是可以直接接受bitmap类型图片的,但是似乎不行。

比如像这样:


  
  
  1. QBitmap bit;
  2. bit.load( ":/new/prefix1/222.bmp");
  3. ui->pushButton->setMask(bit);
  4. ui->pushButton->setStyleSheet( "background-image: url(:/new/prefix1/222.bmp)");

这段代码导致一个问题是图片颜色变化,后来我尝试各种方法也不奏效,甚至这段代码还会导致按钮单击的时候卡顿,目前不知道原因,尽量不用就好了。

奇葩效果如下:

发布了42 篇原创文章 · 获赞 148 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/baidu_37503452/article/details/104253189