gpt4 book ai didi

c++ - 半透明 QWidget 应该可以跨操作系统点击

转载 作者:太空宇宙 更新时间:2023-11-04 14:21:52 25 4
gpt4 key购买 nike

我正在尝试使用 Qt (C++) 应用程序跨操作系统完成以下任务。运行该程序后,会弹出一个新窗口,一个全屏 QWidget。现在我希望它是透明的/透明的,这样用户就不会真正看到它。在这个“层”上,用户可以拖动他/她的鼠标来绘制一个(红色)矩形来选择一个区域,当松开鼠标时,该区域将截取该区域。

问题:
问题在于整个透明层的事情,因为这似乎不能很好地跨操作系统工作。因为当我点击层所在的位置时,调用 mousePressEvent(),我点击它到达它下面的窗口,就好像它根本不存在一样。然而,在 Ubuntu 上,我没有。我想在 Windows 上有同样的效果,但到目前为止我什么都没有...
(使另一个 GUI 对象出现,例如按钮,只会使按钮成为层的可点击部分)

在 Ubuntu 11.04 32 位和 Windows 7 家庭高级版 64 位上测试。 (试图绕过 Mac 的,这个问题会得到解决吗。)

那么有人知道这是怎么回事吗?到目前为止,我已经包含了我的代码。(清除了我所有其他 100 次尝试。)

main.cpp 这里我设置了 translucentBackground,这里我可能漏掉了某个设置或者配置不正确。

#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();
}

小部件.cpp

    #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);
}

widget.h

#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

此外,我想我已经浏览了 Google 将在这个主题上找到的所有结果,就像 Qt 的 API 文档一样。对于这个,我真的没有其他选择了。 (我是用 Java 开始这个项目的,但是到目前为止,带有 Qt 的 C++ 似乎工作量要少得多。)

非常感谢任何帮助!

最佳答案

这是一个完整而彻底的 hack,但这是我所知道的唯一方法。截取屏幕截图,然后将其用作小部件的背景,确保屏幕的正确部分显示在窗口中,尤其是在调整大小或移动等时。至少它是跨平台的。

然而,这也是 KDE 3 的假透明度在 ARGB 视觉效果和 X11 中不存在的东西之前实现的方式。

关于c++ - 半透明 QWidget 应该可以跨操作系统点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6945934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com