半透明QWidget应该可以跨操作系统单击 我试图用Qt C++应用程序,Sig-OS来完成以下几点。 运行程序后,会弹出一个新窗口,即全屏QWidget。现在我希望它是透明的,这样用户就不会真正看到它了。在这个“层”上,用户可以拖动鼠标绘制一个红色矩形,以选择一个区域,当鼠标释放时,该区域将被截图
问题是: 问题在于整个透明层的事情,因为它在操作系统中似乎不太好用。因为当我点击图层的位置时,为了调用MousePresseEvent,我通过它点击到它下面的窗口,就好像它根本不在那里一样。然而,在Ubuntu上,我没有。我想在Windows上有同样的效果,但到目前为止我什么都没有得到。。。 使另一个GUI对象(如button)出现只会使按钮成为层中可单击的部分 在Ubuntu 11.04 32位和Windows 7 Home Premium 64位上测试。试着找到一台Mac机,这个问题会解决吗 有人知道这是怎么回事吗? 到目前为止,我已经包括了我的代码。清除我所有的100次尝试 main.cpp 在这里,我设置了半透明背景,在这里,我可能错过了一个设置或一些东西配置不正确半透明QWidget应该可以跨操作系统单击 我试图用Qt C++应用程序,Sig-OS来完成以下几点。 运行程序后,会弹出一个新窗口,即全屏QWidget。现在我希望它是透明的,这样用户就不会真正看到它了。在这个“层”上,用户可以拖动鼠标绘制一个红色矩形,以选择一个区域,当鼠标释放时,该区域将被截图,c++,qt,cross-platform,qwidget,translucency,C++,Qt,Cross Platform,Qwidget,Translucency,问题是: 问题在于整个透明层的事情,因为它在操作系统中似乎不太好用。因为当我点击图层的位置时,为了调用MousePresseEvent,我通过它点击到它下面的窗口,就好像它根本不在那里一样。然而,在Ubuntu上,我没有。我想在Windows上有同样的效果,但到目前为止我什么都没有得到。。。 使另一个GUI对象(如button)出现只会使按钮成为层中可单击的部分 在Ubuntu 11.04 32位和Windows 7 Home Premium 64位上测试。试着找到一台Mac机,这个问题会解决吗
#include <QtGui/QApplication>
#include "widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
//Fullscreen app
w.showFullScreen();
w.setAttribute(Qt::WA_NoSystemBackground);
w.setAttribute(Qt::WA_TranslucentBackground);
w.setMouseTracking(true);
w.setWindowFlags(Qt::Window | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
//Show
w.show();
return a.exec();
}
widget.cpp
widget.h
另外,我想我已经浏览了谷歌在这个主题上找到的所有结果,与Qt的API文档一样。我真的没有这个选择了。我在java中启动了这个项目,但是C++与Qt似乎是,远远没有那么多的工作。
任何帮助都将不胜感激 这是一次彻底的黑客攻击,但这是我所知道的唯一方法。拍摄屏幕截图,然后将其用作小部件的背景,确保屏幕的正确部分显示在窗口中,尤其是在调整大小或移动等方面。至少它是跨平台的
然而,KDE 3的伪透明性也是在诸如ARGB视觉效果和X11中不存在的东西之前实现的。我曾经在Java中尝试过作为透明性的屏幕截图,但这并不能提供我试图实现的平滑用户体验。因为,从截图拍摄到用户选择一个区域,屏幕上可能会发生很多事情。例如,如果你试图拍摄某个正在制作动画的东西的屏幕截图,比如托盘栏图标,你会错过它,因为你已经看到了一个静态屏幕。我的问题是,这只发生在Windows中,它在Ubuntu Unty和GNOME中运行良好。如果您使用自定义样式,请注意以下qt错误:
#include "widget.h"
#include "ui_widget.h"
#include "QDebug"
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
this->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
QPalette palette(Widget::palette());
palette.setColor(backgroundRole(), Qt::white);
setPalette(palette);
this->clicked = false;
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::mousePressEvent ( QMouseEvent * event )
{
//Record start
if (event->button() == Qt::LeftButton){
x = event->globalX();
y = event->globalY();
this->clicked = true;
width = 0;
height = 0;
}
}
void Widget::mouseMoveEvent ( QMouseEvent * event )
{
if (this->clicked == true){
int x2 = event->globalX();
int y2 = event->globalY();
if(x < x2){
width = x2 - x;
}else{
width = x - x2;
//Resetting startpoint when dragging to the left side on your screen, copy from java so this doesn't actually works yet.
x = x - width-2;
}
if(y < y2){
height = y2 - y;
}else{
height = y - y2;
//Resetting startpoint when dragging to the left side on your screen, copy from java so this doesn't actually works yet.
y = y - height-2;
}
//Redraw rectangle
update();
qDebug("wa");
}
}
void Widget::mouseReleaseEvent ( QMouseEvent * event )
{
if (event->button() == Qt::LeftButton)
{
//Record end
qDebug("-------");
this->clicked = false;
}
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::red);
painter.drawRect(x,y,width,height);
}
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtGui>
#include<QMouseEvent>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
bool clicked;
int x,y,width,height;
void mousePressEvent ( QMouseEvent * event );
void mouseMoveEvent ( QMouseEvent * event );
void mouseReleaseEvent ( QMouseEvent * event );
protected:
void paintEvent(QPaintEvent *);
};
#endif // WIDGET_H