Qt如何实现窗体背景透明,但是背景图片还是正常显示的

songhuirong1 2012-06-16 03:37:33
我有一个需求,一个QWidget给它设置一张背景图片,要求QWidget的背景完全透明,但是上面的背景图片还是正常显示的。我试了下setWindowOpacity(0);QWidget是变透明了,但是图片也透明了。就是说图片的透明度会跟着窗体变化,现在要求窗体透明度变化了,但是图片不受影响、怎么解决?谢谢!
...全文
2250 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Stillily 2014-08-28
  • 打赏
  • 举报
回复
我也想实现这个效果。帮大忙了
jdwx 2012-06-19
  • 打赏
  • 举报
回复
简单点说:
e->pos是鼠标在这个窗口(控件)上的坐标。
e->globalPos()是鼠标在屏幕上的坐标。
songhuirong1 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
重写mousePressEvent
void MainWindow::mousePressEvent(QMouseEvent *e)
{
m_oldPos = e->pos();//m_oldPos是QPoint类型的类成员变量
}

void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
move(e->globalPos() ……
[/Quote]
请问一下e->pos()和e->globalPos()具体怎么理解呀?举个例子看看。
我自己改了下,改成如下就可以了。

void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
// QMessageBox::information(this, tr("Widget"), tr("Click Widget"), QMessageBox::Ok);
// qDebug() << "GlobalPos:" << event->globalPos() << "\ttopLeft:" << geometry().topLeft();
dragPosition = event->globalPos() - geometry().topLeft();
// qDebug() << "dragPosition:" << dragPosition;
}
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)
move(event->globalPos() - dragPosition);
}
jdwx 2012-06-18
  • 打赏
  • 举报
回复
是不是做不规则窗口?
三部:去掉边框,窗口透明(setAttrib),paint图片。

songhuirong1 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
你不要把图片作为QWidget的背景嘛,可以在QWidget上面弄个QLable之类的控件,QLable再加载张图片进去。再不行就弄多个不透明的窗口,加载背景图片,每次都两个窗口一起显示出来,不透明的在上层。
[/Quote]
按照你的说法,我觉得是无法实现我想要的效果的。你能否再解释清楚点?谢谢!
songhuirong1 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
补充一句,不知道楼主的QT版本是多少,目前我试过4.4版本以下的实现背景透明会比较麻烦,4.5以后补充了一些函数,很轻松的就设置透明了
[/Quote]
我用的是Qt 4.8的版本,请问我该如何实现呢?谢谢!
我是学友 2012-06-18
  • 打赏
  • 举报
回复
补充一句,不知道楼主的QT版本是多少,目前我试过4.4版本以下的实现背景透明会比较麻烦,4.5以后补充了一些函数,很轻松的就设置透明了
jdwx 2012-06-18
  • 打赏
  • 举报
回复
重写mousePressEvent
void MainWindow::mousePressEvent(QMouseEvent *e)
{
m_oldPos = e->pos();//m_oldPos是QPoint类型的类成员变量
}

void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
move(e->globalPos() - m_oldPos);
}
songhuirong1 2012-06-18
  • 打赏
  • 举报
回复
这是我的代码

void Widget::mouseMoveEvent(QMouseEvent *event)
{
move(event->globalPos());
}

请问该如何修正呢?谢谢!
songhuirong1 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QtGui>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindow……
[/Quote]
非常感谢您的帮忙,我按照您的方法去试验了下,现在可以了。我再问个问题,我现在想让这个不规则控件可以在屏幕上任意拖动。我重写了mouseMoveEvent,但是鼠标位置不正确,请您指点下。我的代码是这样的:
void Widget::mouseMoveEvent(QMouseEvent *event)
{
move(event->globalPos());
}
jdwx 2012-06-18
  • 打赏
  • 举报
回复
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QtGui>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint);去掉边框,保留任务栏菜单
setAttribute(Qt::WA_TranslucentBackground);透明
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.save();
QBrush brush(QColor(0,0,0));
p.setBrush(brush);
p.drawRoundedRect(rect(),20,20);
p.restore();
}
以上是cpp文件的内容,如果是用图片红色的代码改成p.drawPixmap()就可以了。
jdwx 2012-06-18
  • 打赏
  • 举报
回复
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QtGui>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint);
setAttribute(Qt::WA_TranslucentBackground);
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.save();
QBrush brush(QColor(0,0,0));
p.setBrush(brush);
p.drawRoundedRect(rect(),20,20);
p.restore();

}
以上是cpp文件的内容,如果是用图片改成p.drawPixmap()就可以了。
songhuirong1 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
是不是做不规则窗口?
三部:去掉边框,窗口透明(setAttrib),paint图片。
[/Quote]
恩。我是想做不规则窗体,你说的三步能不能给出具体的代码呢?万分感激呀!
meiky 2012-06-17
  • 打赏
  • 举报
回复
你不要把图片作为QWidget的背景嘛,可以在QWidget上面弄个QLable之类的控件,QLable再加载张图片进去。再不行就弄多个不透明的窗口,加载背景图片,每次都两个窗口一起显示出来,不透明的在上层。

16,814

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧