• 2773阅读
  • 1回复

急:透空窗体刷新控件 [复制链接]

上一主题 下一主题
离线hyh0lh
 

只看楼主 倒序阅读 楼主  发表于: 2013-07-18
各位好啊。 我当前的项目需要QT做界面层。界面属于最上面的层,下面还有许多其他层的东西,包括一些绘图,这就要求我在界面的显示部分挖空,即我的QT主窗体部分部分区域透空。我通过设置QWidget::setMask()成功完成。先说说怎么实现这个,相信很多人需要。
setMask()函数有2个重载函数,一个是setMask(QBitmap),一个是setMask(QReigon)。我就是使用QBitmap来完成(对QReigon测试发现只能对reigon以外的区域透明,而reigon区域不透明)。2个方法:1、在主控件上定义paintEvent()和resizeEvent()这两个虚函数,然后在resizeEvent(()内绘制一个bitmap的类并设置setMask(),具体代码如下:
QBitmap bitmap(width(),height());
QPainter bitPainter(&bitmap);
//不透空区,这部分也需要在paintEvent()里进行重绘才行
painter.setBrush(QBrush(QColor(0,0,0)));
painter.drawRect(0, 0, width(), height());
//透空区
painter.setBrush(QBrush(QColor(255,255,255));
paineter.drawRect(100, 100, 100, 100);//透明的区域大小和位


置自己决定
//注意上面两个部分不能颠倒,我测试的结果是会是窗体透空失效
/*
*这一部分放置你需要重新绘制在透空窗体上的东西,并且需要在


paintEven()函数里进行同样绘制
*/
setMask(bitmap);


注意不透空区域的代码最好也在paintEvent内重新实现,否则可能出现问题。而在透空区的东西一定要重绘,否则出问题的几率90%。
到这里我能完成的部分。后面就出现了我困扰的部分我在透空区域部分要显示操作控件,虽然上面说了如何在透空区显示简单的对象,但对复杂的控件我就无能为力了。比方说一个新的QFrame上个各种控件(包括图片按钮什么的)的正常显示。


请各位高手帮忙,我这边急等。
我在网上查了一些新的,发现好像是因为在其他子控件(或者说窗体)刷新的时候,主控件也刷新导致上面的控件无法刷新出来。大家看看怎么解决。
离线hyh0lh

只看该作者 1楼 发表于: 2013-07-18
up一下
快速回复
限100 字节
 
上一个 下一个