提要

自定义的弹出窗口,窗口可以实现按下鼠标拖动,鼠标释放停止拖动,窗口种含有子控件,下拉列表,在点击下拉列表时窗口移动。

解决方法

因为点击下拉列表的时候,触发了窗口的移动事件,所以添加下拉列表的事件过滤。
下面附上实现代码:

ui->comboBoxReso->installEventFilter(this);bool ResolutionDialog::eventFilter(QObject *obj, QEvent *event)
{if(obj == ui->comboBoxReso){if(event->type() == QEvent::MouseMove){return true;}}return QDialog::eventFilter(obj,event);
}

ui文件的结构如下:

在构造函数种安装控件的事件过滤器。然后重写过滤事件。
完整的代码如下:
resolutiondialog.h

#ifndef RESOLUTIONDIALOG_H
#define RESOLUTIONDIALOG_H#include <QDialog>
#include "datastruct.h"/***********类功能描述:分辨率设置对话框************/
namespace Ui {class ResolutionDialog;
}class ResolutionDialog : public QDialog
{Q_OBJECTpublic:explicit ResolutionDialog(QWidget *parent = nullptr);~ResolutionDialog();//初始化void initResolutions();//初始化下拉列表的分辨率protected:bool eventFilter(QObject *obj, QEvent *event);//过滤事件,过滤掉下拉列表的点击事件void mousePressEvent(QMouseEvent *event);//鼠标点击void mouseMoveEvent(QMouseEvent *event);//鼠标移动事件void mouseReleaseEvent(QMouseEvent *event);//鼠标释放事件
signals:void sigEveryResolution(stuReso &stuResolution);//发送每块屏的屏幕分辨率
public slots:void onSetRowColSlot(int row,int col);//设置SpinBox的行列信息
private slots:void on_closeBtn_clicked();//关闭按钮void on_confirmBtn_clicked();//确定按钮void on_cancelBtn_clicked();//取消按钮private:Ui::ResolutionDialog *ui;QPoint              m_offPos;//鼠标点击点与窗口左上角之间的距离
};#endif // RESOLUTIONDIALOG_H

resolutiondialog.cpp

#include "resolutiondialog.h"
#include "ui_resolutiondialog.h"
#include <QStyledItemDelegate>ResolutionDialog::ResolutionDialog(QWidget *parent) :QDialog(parent),ui(new Ui::ResolutionDialog)
{ui->setupUi(this);initResolutions();QStyledItemDelegate *delegate = new QStyledItemDelegate();ui->comboBoxReso->setItemDelegate(delegate);ui->comboBoxReso->installEventFilter(this);setWindowFlag(Qt::FramelessWindowHint);setAttribute(Qt::WA_TranslucentBackground);
}ResolutionDialog::~ResolutionDialog()
{delete ui;
}void ResolutionDialog::initResolutions()
{QList<QString> strList;strList.append("3840x2160");strList.append("1920x1080");strList.append("1680x1050");strList.append("1600x900");strList.append("1440x900");strList.append("1366x768");strList.append("1280x1024");QStringList strResoList(strList);ui->comboBoxReso->addItems(strResoList);
}bool ResolutionDialog::eventFilter(QObject *obj, QEvent *event)
{if(obj == ui->comboBoxReso){if(event->type() == QEvent::MouseMove){return true;}}return QDialog::eventFilter(obj,event);
}void ResolutionDialog::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {QPoint startPos = event->globalPos();m_offPos = startPos - geometry().topLeft();}QDialog::mousePressEvent(event);
}void ResolutionDialog::mouseMoveEvent(QMouseEvent *event)
{if (event->buttons() == Qt::LeftButton) {QPoint endPos = event->globalPos();move(endPos - m_offPos);}QDialog::mouseMoveEvent(event);
}void ResolutionDialog::mouseReleaseEvent(QMouseEvent *event)
{QDialog::mouseReleaseEvent(event);
}void ResolutionDialog::onSetRowColSlot(int row, int col)
{ui->spinBoxRow->setRange(0,row-1);ui->spinBoxCol->setRange(0,col-1);
}void ResolutionDialog::on_closeBtn_clicked()
{close();
}void ResolutionDialog::on_confirmBtn_clicked()
{stuReso tempReso;tempReso.row = ui->spinBoxRow->value();tempReso.col = ui->spinBoxCol->value();QString strTemp = ui->comboBoxReso->currentText();QStringList strList = strTemp.split('x');QString strW = strList.first();QString strH = strList.last();tempReso.width = strW.toInt();tempReso.height = strH.toInt();emit  sigEveryResolution(tempReso);accept();
}void ResolutionDialog::on_cancelBtn_clicked()
{reject();
}

上面只将这个出现上述问题的类的代码附上。因为其中涉及到项目中的一些需求实现,读者可以选择性读取,理解我说明的问题解决思路便好,代码可以参考。由于涉及到qss文件设置样式,那部分没有贴出来,读者可以注释掉背景透明和无边框的设置。

qt自定义含有拖动功能的窗口在点击窗口的下拉列表时窗口移动相关推荐

  1. python点击按钮弹出新窗口_PyQt5点击button如何弹出新窗口?

    怎么通过点击button,来打开一个新的窗口? 是写在同一个脚本里,还是把新窗口的代码放在另一个脚本里,然后通过点击按钮来运行? import sys from PyQt5.QtWidgets imp ...

  2. mfc在控件中嵌入多个窗口,点击按钮切换显示不同窗口

    主窗口添加三个按钮与一个picturecontrol控件,切换的多个窗口嵌入到图片控件中 在资源视图中,右键rc资源文件,添加资源,选择Diaglog窗口资源,新建 建立的子窗口,设置窗口属性 Sty ...

  3. Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现

    文章目录 前言 效果 代码 .pro文件 widget.h widget.cpp widget.ui title.h title.cpp title.ui 前言 本次实验内容为Qt自定义标题栏,最小化 ...

  4. pyqt5+qt desiger实例教程(1)创建含有三个按钮的窗口,点击按钮2输出消息、按钮3可退出

    pyqt5+qt desiger实例教程(1)创建含有三个按钮的窗口,点击按钮三可退出 目标:设计一个含有三个按钮的窗口,点击按钮2弹出消息,点击按钮3退出 如果是使用的anacoda那么自带qtde ...

  5. 【QT 5 设置自定义标题栏+学习:《QT实现鼠标拖动调整窗口大小》+基础样例】

    [QT 5 设置自定义标题栏+学习:<QT实现鼠标拖动调整窗口大小>+基础样例] 1.说明 2.实验环境 3.实验目的 4.参考文章 5.实验步骤 (1)下载代码,运行没有错误. (2)加 ...

  6. 【QT】QT从零入门教程(十一):QT自定义窗口

      首先是借鉴了网上的博客,实现无边框,自由拖动的自定义窗口效果. #ifndef CUSTOMWINDOW_H #define CUSTOMWINDOW_H #include <QtGui&g ...

  7. 【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口

    [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口 文章目录 [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大 ...

  8. PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化

    PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化 文章目录 PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变 ...

  9. QT自定义精美换肤界面

    QT自定义精美换肤界面 陆陆续续用QT开发过很多项目,也用QT写过不少私活项目,也写过N个工具,一直梦寐以求能像VC一样可以很方便的有个自定义的界面,QSS的强大让我看到了很好的希望,辗转百度谷歌无数 ...

最新文章

  1. Attention Is All You Need (transformer)
  2. 以太坊DAPP[2]-×××-react框架与web3实例
  3. 重磅嘉宾公布,第四范式AI新品发布会进入报名倒计时
  4. .attr()与.removeAttr()
  5. 【转载】汇编速查手册
  6. 我的世界服务器物品属性,属性 - Minecraft Wiki,最详细的官方我的世界百科
  7. 解析json数组——TypeToken
  8. 20191001每日一句
  9. php pdo 抛出异常模式,php实现的PDO异常处理操作分析
  10. 《Java语言程序设计》(基础篇原书第10版)第五章复习题答案
  11. 解决Mac无法识别移动硬盘以及无法识别BootCamp Windows分区的问题
  12. linux安装iscsi设备,linux系统下安装配置iSCSI教程
  13. 2021暑假Leetcode刷题——Two Pointers(2)
  14. 我的IT之路2011(一)
  15. 37 一次获取redis连接阻塞引起的 Thread pool is EXHAUSTED
  16. P3435 [POI2006]OKR-Periods of Words [Kmp, next数组]
  17. html好看的侧滑效果,H5 - 侧滑效果实现
  18. Gradle教程和指南 - 构建审视
  19. 人人都要懂的代码重构
  20. 重构之美-跨越Web标准,触碰语义网[开门见山:Microformat]

热门文章

  1. 谈谈JVM内部锁升级过程
  2. 一站式云原生智能告警运维平台——SLS新版告警发布!
  3. 移动研发 DevOps 落地实践
  4. 使用EMR Spark Relational Cache跨集群同步数据
  5. 利用Serverless Kubernetes和Kaniko快速自动化构建容器镜像
  6. Colima:MacOS 上的极简容器运行时和 Kubernetes
  7. 无需 Dockerfile 的镜像构建:BuildPack vs Dockerfile
  8. SuperEdge正式成为CNCF沙箱项目,腾讯云携手六家厂商在边缘计算领域踏入新篇章
  9. 数据库怎么选择?终于有人讲明白了
  10. java jndi使用_Java项目中使用JNDI连接数据库