窗口透明化后的控件移动问题

la_vie_est_belle
Python领域优质创作者
博客专家认证
2017-07-31 07:01:16
下面是代码,请大神指教!

#ifndef GOODASSISTANT_H
#define GOODASSISTANT_H

#include<QWidget>
#include<QLineEdit>
#include<QToolButton>
#include<QPoint>

class GoodAssistant : public QWidget
{
Q_OBJECT

public:
GoodAssistant(QWidget *parent = 0);
~GoodAssistant();
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
private:
QLineEdit *search_le;
QToolButton *search_tbtn;
QToolButton *add_tbtn;
QPoint drag_position;
QPoint mouse_position;
private slots:

};

#endif // GOODASSISTANT_H


#include "goodassistant.h"
#include<QPixmap>
#include<QHBoxLayout>
#include<QGridLayout>
#include<QSplitter>
#include<QMouseEvent>

GoodAssistant::GoodAssistant(QWidget *parent)
: QWidget(parent)
{
search_le = new QLineEdit;
search_le->setFixedSize(640, 35); //设置搜索输入框大小
search_le->setPlaceholderText(tr("谁是世界上最帅的人?")); //默认显示字
search_le->setFocus(); //自动聚焦在输入框上

add_tbtn = new QToolButton;
add_tbtn->setFixedSize(35, 35); //设置添加按钮大小
add_tbtn->setToolTip(tr("添加问题和解决方案")); //按钮提示
add_tbtn->setIcon(QPixmap(":/images/add.png")); //使用Qt的资源机制法添加图片
add_tbtn->setIconSize(QSize(35, 35)); //设置图片在按钮上的大小
add_tbtn->setCursor(Qt::PointingHandCursor); //设置鼠标指针形态
add_tbtn->setStyleSheet("border:0;"); //把按钮边框设为0
//信号与槽

QHBoxLayout *searchle_and_addtbtn = new QHBoxLayout;
searchle_and_addtbtn->addStretch(); //添加占位符,好让add按钮位于输入框最右
searchle_and_addtbtn->addWidget(add_tbtn); //加入添加按钮
searchle_and_addtbtn->setContentsMargins(0, 1, 0, 0); //设置边距
search_le->setLayout(searchle_and_addtbtn); //设置输入框布局
search_le->setTextMargins(0, 0, add_tbtn->width(), 0); //设置文字输入尾端限制

search_tbtn = new QToolButton;
search_tbtn->setFixedSize(100, 35); //设置搜索按钮大小
search_tbtn->setToolTip(tr("点击搜索")); //按钮提示
search_tbtn->setIcon(QPixmap(":images/search.png")); //使用Qt的资源机制法添加图片
search_tbtn->setIconSize(QSize(100, 35)); //设置图片在按钮上的大小
search_tbtn->setCursor(Qt::PointingHandCursor); //设置鼠标指针形态
search_tbtn->setStyleSheet("border:0;"); //把按钮边框设为0

QSplitter *search_splitter = new QSplitter(Qt::Horizontal, this); //创建横向切分窗口
search_splitter->setHandleWidth(0); //设置切分条宽度
search_splitter->setFrameShape(QFrame::Panel);
search_splitter->addWidget(search_le);
search_splitter->addWidget(search_tbtn);
//search_splitter->setStretchFactor(0, 0); 不需要,因为上面已经用了setFixedSize()
//search_splitter->setStretchFactor(1, 0); setChildrenCollapsible()也不需要

QGridLayout *main_layout = new QGridLayout; //在父窗体中布局并显示
main_layout->addWidget(search_splitter);
setLayout(main_layout);
}

GoodAssistant::~GoodAssistant()
{

}

void GoodAssistant::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
drag_position = event->globalPos() - geometry().topLeft();
mouse_position = event->pos();
event->accept();
}
if(event->button() == Qt::RightButton)
close();
}

void GoodAssistant::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)
{
move(pos() - drag_position + event->pos() - mouse_position);
event->accept();
}
}


#include "goodassistant.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GoodAssistant w;
//w.setWindowOpacity(1); //窗口透明度,0为透明,1为不透明
w.setWindowFlags(Qt::FramelessWindowHint); //取消边框
w.setAttribute(Qt::WA_TranslucentBackground); //窗口背景透明
w.show();

return a.exec();
}


把窗口边框取消以及 窗口背景透明化后,把鼠标放在搜索按钮上,想用这个来拖曳整个控件。但是点击到搜索按钮上,一拖动,就会马上闪现到鼠标点击的位置上,然后再进行拖曳动作。想了好久,只有把鼠标移动事件中的move函数改成这样才好像不会闪现的特别严重,但是爆卡!move(event->globalPos() - QPoint(740, 35)); //该输入框+搜索按钮的大小为740, 35.

如果窗口背景不透明的话,移动起来没问题,这个我会,但是把背景透明化后通过搜索按钮来移动就很有问题,感觉整个控件的坐标都变了。。。跪求大神解决!!!
...全文
440 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
la_vie_est_belle 2017-09-01
  • 打赏
  • 举报
回复
引用 3 楼 qqwangfan 的回复:
你的移动位置是不是写的不对?我是这样拖动窗口的,这个能正常拖动窗口: void QShowFingerVein::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::LeftButton) { m_bPress = true; m_point = e->globalPos() - this->pos(); e->accept(); } } void QShowFingerVein::mouseReleaseEvent(QMouseEvent *e) { m_bPress = false; } void QShowFingerVein::mouseMoveEvent(QMouseEvent *e) { if (m_bPress) { move(e->globalPos() - m_point); e->accept(); } }
还是不行诶,搜索那个按钮的时候还是有闪现。这个是窗口透明化和隐藏之后才导致的,如果不隐藏窗口的话,拖动是正常的
la_vie_est_belle 2017-09-01
  • 打赏
  • 举报
回复
引用 2 楼 La_vie_est_belle 的回复:
我顶
还是不行,搜索那个按钮的时候还是有闪现。这个是窗口透明化和隐藏之后才导致的,如果不隐藏窗口的话,拖动是正常的
yyxmm 2017-08-20
  • 打赏
  • 举报
回复
那是因为你移动部分的代码写的不对,参照楼上的就好了
  • 打赏
  • 举报
回复
你的移动位置是不是写的不对?我是这样拖动窗口的,这个能正常拖动窗口: void QShowFingerVein::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::LeftButton) { m_bPress = true; m_point = e->globalPos() - this->pos(); e->accept(); } } void QShowFingerVein::mouseReleaseEvent(QMouseEvent *e) { m_bPress = false; } void QShowFingerVein::mouseMoveEvent(QMouseEvent *e) { if (m_bPress) { move(e->globalPos() - m_point); e->accept(); } }
la_vie_est_belle 2017-08-01
  • 打赏
  • 举报
回复
我顶
la_vie_est_belle 2017-07-31
  • 打赏
  • 举报
回复
编译后是这个样子的。想通过右边的搜索按钮来移动,但是被难住了。。。

16,235

社区成员

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

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