透明窗口诡异的问题

dinjay 2012-03-30 03:51:10
我对自己创建的widget使用
w.setAttribute(Qt::WA_TranslucentBackground, true);
后,奇怪的是鼠标的事件就拦截不到了,
我创建的是一个没有标题栏和边框的widget。

说白了就一个纯透明的窗口。
如果不加
w.setAttribute(Qt::WA_TranslucentBackground, true);
这样的话就可以进入到鼠标事件里。
奇怪了~~~~
...全文
236 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
dinjay 2012-04-12
  • 打赏
  • 举报
回复
http://alexclark.itpub.net/post/670/21160
参考

extern "C" LRESULT CALLBACK MouseProc(int code,WPARAM wParam,LPARAM lParam)
//钩子处理函数
{
if (code 〈 0)
//若code〈0,则直接调用CallNextHookEx返回
return CallNextHookEx(hhook, code, wParam, lParam);
if(wParam= =WM_LBUTTONDOWN)
{MouseClick++;
//记录鼠标单击次数
}
return CallNextHookEx(hhook, code, wParam,lParam);
}

return CallNextHookEx(hhook, code, wParam,lParam);就是返回给系统处理。否则return 0;自己处理
zhjun5337 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

引用 19 楼 的回复:

引用 18 楼 的回复:

....太诡异了,不知道qt对透明后消息是怎么处理的。按理说不应该相应不到的啊

我想问一下,如果用这个,怎样让windows来处理一部分鼠标事件,而不是全部用qt来处理。

使用鼠标钩子可以解决
[/Quote]
用鼠标钩子好像只能拦截鼠标事件,但是怎样让系统去接管鼠标事件。
dinjay 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

引用 18 楼 的回复:

....太诡异了,不知道qt对透明后消息是怎么处理的。按理说不应该相应不到的啊

我想问一下,如果用这个,怎样让windows来处理一部分鼠标事件,而不是全部用qt来处理。
[/Quote]
使用鼠标钩子可以解决
zhjun5337 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

....太诡异了,不知道qt对透明后消息是怎么处理的。按理说不应该相应不到的啊
[/Quote]
我想问一下,如果用这个,怎样让windows来处理一部分鼠标事件,而不是全部用qt来处理。
dinjay 2012-03-31
  • 打赏
  • 举报
回复
....太诡异了,不知道qt对透明后消息是怎么处理的。按理说不应该相应不到的啊
whyboysa 2012-03-31
  • 打赏
  • 举报
回复
刚才看帖子的时候还没有15楼。。。。。。
whyboysa 2012-03-31
  • 打赏
  • 举报
回复
刚才试了下
newImage.fill(QColor(255, 255, 255, 0).rgba());

楼主把这行的 的透明度换成1 就可以捕获 事件了。
newImage.fill(QColor(255, 255, 255, 1).rgba());

这个现象很奇怪啊。
dinjay 2012-03-31
  • 打赏
  • 举报
回复
测试了一下,主要是这句话,
// 填充透明色
newImage.fill(QColor(255, 255, 255, 0).rgba());

如果
setAttribute(Qt::WA_TranslucentBackground, true);这样设置了,fill的颜色透明度至少是1,这样才能接收到事件。这是windows上的,在mac上,这个透明度要大于11,10都不行。
dinjay 2012-03-31
  • 打赏
  • 举报
回复
windows、mac,linux上我都试了,不行。
jdwx 2012-03-30
  • 打赏
  • 举报
回复
全透明的窗口,根本就看不见,点不到,直接穿透了。
我的是windows
jdwx 2012-03-30
  • 打赏
  • 举报
回复
都是什么系统啊?
dinjay 2012-03-30
  • 打赏
  • 举报
回复

MyRubberBand.h
#ifndef MYRUBBERBAND_H
#define MYRUBBERBAND_H
#include <QWidget>
#include <QImage>
class MyRubberBand : public QWidget
{
Q_OBJECT
public:
protected:
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
QImage m_image;
};
#endif // MYRUBBERBAND_H

MyRubberBand.cpp

#include "myrubberband.h"
#include <QDesktopWidget>
#include <QRect>
#include <QApplication>
#include <QDebug>
#include <QPainter>
#include <QPaintEvent>

MyRubberBand::MyRubberBand(QWidget *parent) :
QWidget(0, Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint)
{
setFocusPolicy(Qt::NoFocus);
setAttribute(Qt::WA_TranslucentBackground, true);
this->setMouseTracking(true);
QRect desktopRect = QApplication::desktop()->availableGeometry();
setFixedSize(desktopRect.width(), desktopRect.height()); // 固定窗体大小
move(desktopRect.topLeft());
}
void MyRubberBand::mousePressEvent(QMouseEvent *event)
{
qDebug()<<"mousePressEvent";
}
void MyRubberBand::mouseReleaseEvent(QMouseEvent *event)
{
qDebug()<<"mouseReleaseEvent";
}

void MyRubberBand::mouseMoveEvent(QMouseEvent *event)
{
qDebug()<<"mouseMoveEvent";
}
void MyRubberBand::paintEvent(QPaintEvent *event)
{
qDebug()<< "MyRubberBand paintEvent:"<<m_image.width()<<" "<<m_image.height();
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
QRect dirty = event->rect();
p.drawImage(dirty, m_image, dirty);
}
void MyRubberBand::resizeEvent(QResizeEvent *event)
{
int newWidth = width(); //qMax(width(), m_image.width());
int newHeight = height(); //qMax(height(), m_image.height());
qDebug("MyRubberBand Width = %d Height = %d", newWidth, newHeight);
QSize newSize(newWidth, newHeight);
QImage newImage(newSize, QImage::Format_ARGB32);
// 填充透明色
newImage.fill(QColor(255, 255, 255, 0).rgba());

m_image = newImage;

update();

// QWidget::resizeEvent(event);
}

main.cpp

#include <QtGui/QApplication>
#include "mainwindow.h"
#include "myrubberband.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyRubberBand myband;
myband.show();
return a.exec();
}


你试试,我这里怎么都没戏、
念茜 2012-03-30
  • 打赏
  • 举报
回复
是很诡异,我完全用你的代码,无更改,都可以捕获的。
dinjay 2012-03-30
  • 打赏
  • 举报
回复
擦.......这是为什么~~~~~
念茜 2012-03-30
  • 打赏
  • 举报
回复
在我这没问题的……
dinjay 2012-03-30
  • 打赏
  • 举报
回复
那奇怪了、

FullScreenWidget::FullScreenWidget(QWidget *parent) :
QWidget(0, Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint)
{
setFocusPolicy(Qt::NoFocus);
setAttribute(Qt::WA_TranslucentBackground, true);
this->setMouseTracking(true);
QRect desktopRect = QApplication::desktop()->availableGeometry();
setFixedSize(desktopRect.width(), desktopRect.height()); // 固定窗体大小
move(desktopRect.topLeft());
}
void FullScreenWidget::mousePressEvent(QMouseEvent *event)
{
qDebug()<<"mousePressEvent";
}

void FullScreenWidget::mouseReleaseEvent(QMouseEvent *event)
{
qDebug()<<"mouseReleaseEvent";
}

void FullScreenWidget::mouseMoveEvent(QMouseEvent *event)
{
qDebug()<<"mouseMoveEvent";
}

不行啊
念茜 2012-03-30
  • 打赏
  • 举报
回复
空窗体不设置setMouseTracking(true);也OK的

我也好奇你是怎么做到无法捕获的
念茜 2012-03-30
  • 打赏
  • 举报
回复
mouseMoveEvent
mousePressEvent
mouseReleaseEvent

全部都有的

念茜 2012-03-30
  • 打赏
  • 举报
回复
我刚实验了一下,如果你确定没有漏掉

#include <QMouseEvent>
setMouseTracking(true);


mouseMoveEvent绝对有的
dinjay 2012-03-30
  • 打赏
  • 举报
回复
mouseMoveEvent
mousePressEvent
mouseReleaseEvent
都不行,mouseMoveEvent的话也没有的。
加载更多回复(2)

16,213

社区成员

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

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