Qt浅谈之四十五QSplitter实现自由伸缩滑动窗口
一、简介
最近看到一篇Qt实现伸缩滑动的窗口的文章,但其代码不完整。便在此重新书写了完整的代码,并开源出来。窗口的中央有滑动条可以动态改变子窗口的大小,隐藏的按钮可以快速伸缩子窗口。其效果图如下:
二、详解
1、代码
(1)slidingwindow.h
- #ifndef SLIDINGWINDOW_H
- #define SLIDINGWINDOW_H
- #include <QtGui>
- class SlidingWindow : public QWidget
- {
- Q_OBJECT
- public:
- SlidingWindow(QWidget *parent = 0);
- ~SlidingWindow();
- protected:
- void mousePressEvent ( QMouseEvent * event);
- void mouseMoveEvent(QMouseEvent *event);
- void mouseReleaseEvent(QMouseEvent *event);
- void resizeEvent(QResizeEvent *event);
- bool eventFilter(QObject *obj, QEvent *event);
- private:
- void setBtnPos();
- void setBtnIcon();
- private slots:
- void slotClickedBtn();
- void slotSplitterMoved(int pos, int index);
- private:
- QPoint dragPosition;
- bool bPressFlag;
- QSplitter *splitter;
- QFrame *contentFrame;
- QFrame *listFrame;
- QPushButton *pushButton;
- QIcon leftIcon;
- QIcon rightIcon;
- };
- #endif // SLIDINGWINDOW_H
(2)slidingwindow.cpp
- #include "slidingwindow.h"
- SlidingWindow::SlidingWindow(QWidget *parent)
- : QWidget(parent, Qt::FramelessWindowHint)
- , bPressFlag(false)
- {
- resize(660, 460);
- splitter = new QSplitter(Qt::Horizontal, this);
- splitter->setHandleWidth(1);
- splitter->setStyleSheet("QSplitter::handle{background:#FFFFFF}");
- contentFrame = new QFrame(splitter);
- contentFrame->setStyleSheet("background:#000000");
- contentFrame->resize(475, height());
- contentFrame->setMinimumWidth(405);
- listFrame = new QFrame(splitter);
- listFrame->setStyleSheet("background:#323232");
- listFrame->resize(660 - 475, height());
- listFrame->setMaximumWidth(660 - 405);
- connect(splitter, SIGNAL(splitterMoved(int,int)), this, SLOT(slotSplitterMoved(int,int)));
- leftIcon = QIcon(":/left.png");
- rightIcon = QIcon(":/right.png");
- pushButton = new QPushButton(this);
- pushButton->setFocusPolicy(Qt::NoFocus);
- pushButton->hide();
- pushButton->setFixedSize(13, 42);
- pushButton->setIconSize(pushButton->size());
- pushButton->setStyleSheet("border:none;");
- pushButton->setIcon(rightIcon);
- pushButton->move(contentFrame->width() - pushButton->width()-2, (contentFrame->height() - pushButton->height())/2);
- connect(pushButton,SIGNAL(clicked()),this,SLOT(slotClickedBtn()));
- contentFrame->setMouseTracking(true);
- listFrame->setMouseTracking(true);
- contentFrame->installEventFilter(this);
- listFrame->installEventFilter(this);
- }
- SlidingWindow::~SlidingWindow()
- {
- }
- void SlidingWindow::resizeEvent(QResizeEvent *event)
- {
- splitter->setGeometry(0, 0, width(), height());
- move((QApplication::desktop()->width() - width())/2, (QApplication::desktop()->height() - height())/2);
- QWidget::resizeEvent(event);
- }
- bool SlidingWindow::eventFilter(QObject *obj, QEvent *event)
- {
- if (event->type() == QEvent::MouseMove) {
- QMouseEvent *mouseMove = static_cast<QMouseEvent*>(event);
- QRect rect = pushButton->frameGeometry();
- if (rect.contains(mouseMove->pos())) {
- pushButton->show();
- }
- else {
- pushButton->hide();
- }
- }
- return QWidget::eventFilter(obj, event);
- }
- void SlidingWindow::setBtnPos()
- {
- pushButton->move(contentFrame->width() - pushButton->width(), (contentFrame->height() - pushButton->height())/2);
- }
- void SlidingWindow::setBtnIcon()
- {
- if (listFrame->width() != 0) {
- pushButton->setIcon(rightIcon);
- }
- else {
- pushButton->setIcon(leftIcon);
- }
- }
- void SlidingWindow::slotClickedBtn()
- {
- QList <int> sizeList;
- sizeList.clear();
- if (listFrame->width() != 0) {
- sizeList.append(660);
- sizeList.append(0);
- }
- else {
- sizeList.append(475);
- sizeList.append(660 - 475);
- }
- splitter->setSizes(sizeList);
- setBtnIcon();
- setBtnPos();
- pushButton->hide();
- }
- void SlidingWindow::slotSplitterMoved(int pos, int index)
- {
- Q_UNUSED(pos)
- Q_UNUSED(index)
- setBtnIcon();
- setBtnPos();
- }
- void SlidingWindow::mousePressEvent ( QMouseEvent * event)
- {
- bPressFlag = true;
- dragPosition = event->pos();
- QWidget::mousePressEvent(event);
- }
- void SlidingWindow::mouseMoveEvent(QMouseEvent *event)
- {
- if (bPressFlag) {
- QPoint relaPos(QCursor::pos() - dragPosition);
- move(relaPos);
- }
- QWidget::mouseMoveEvent(event);
- }
- void SlidingWindow::mouseReleaseEvent(QMouseEvent *event)
- {
- bPressFlag = false;
- QWidget::mouseReleaseEvent(event);
- }
(3)main.cpp
- #include "slidingwindow.h"
- #include <QApplication>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- SlidingWindow w;
- w.show();
- return a.exec();
- }
(4)编译运行
三、总结
(1)获取位置坐标可以尝试QPoint realPos(QCursor::pos() - this->pos());,这样不用类型转换。主要设置setMouseTracking(true);才能当鼠标不点击时移动鼠标进入mouseMoveEvent事件函数。
(2)源码已上传到csdn:http://download.csdn.net/detail/taiyang1987912/9439233。
(3)若有问题或建议,请留言,在此感谢!
http://blog.csdn.net/taiyang1987912/article/details/50717179
Qt浅谈之四十五QSplitter实现自由伸缩滑动窗口的更多相关文章
- QSplitter实现自由伸缩滑动窗口部件(要在m_pSplitter中加入frame_4之前,给frame_4设置样式;之后设置无效)
实现代码如下: #include <QSplitter> QSplitter *m_pSplitter; m_pSplitter = new QSplitter(ui->frame_ ...
- Qt浅谈之四十九俄罗斯方块(代码来自网络)
一.简介 从网上下载了一个Qt实现的俄罗斯方块单机版的源码,觉得非常有意思,故以博客形式记录下来,以便慢慢来研究.在centos6.6下编译运行(注意程序运行需要读取pro目录的配置文件,若把编译目录 ...
- Qt浅谈之十八:GraphicsView框架事件处理(有源码下载)
一.简介 GraphicsView支持事件传播体系结构,可以使图元在场景scene中得到提高了已被的精确交互能力.图形视图框架中的事件都是首先由视图进行接收,然后传递给场景,再由场景给相应的图形项. ...
- Qt浅谈之三十九圆形进度条(已经有50篇了)
http://blog.csdn.net/taiyang1987912/article/category/2314763
- Qt浅谈内存泄露(总结)
Qt浅谈内存泄露(总结) 来源 http://blog.csdn.net/taiyang1987912/article/details/29271549 一.简介 Qt内存管理机制:Qt 在内部能够维 ...
- Qt浅谈之总结(整理)
Qt浅谈之总结(整理) 来源 http://blog.csdn.net/taiyang1987912/article/details/32713781 一.简介 QT的一些知识点总结,方便以后查阅. ...
- Qt::浅谈信号槽连接,参数在多线程中的使用
Qt的信号槽有五种连接方式定义在enum Qt::ConnectionType,下面简单介绍 Qt::AutoConnection:自动判断连接方式,如果信号发送对象和执行槽对象在同一线程,那么等于Q ...
- Qt浅谈之二十App自动重启及关闭子窗口
一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...
- Qt浅谈之二十App自动重启及关闭子窗口(六种方法)
一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...
随机推荐
- char和int的转换
import java.util.Scanner; public class test7 { public static void main(String[] args) { // TODO Auto ...
- 【转】H264视频编码级别说明profile level Encoder
版权声明:本文为博主原创文章,未经博主允许不得转载. 首先要阐明所谓的AVC其实就是H.264标准,是由ITU-T和ISO/IEC组成的联合视频组(JVT,Joint Video Team)一起开发的 ...
- socket实现局域网通信
今天实现了一个局域网通信的小例子,上来记录一下,代码不成熟,勿拍. 这是我本机客户端: 这是我虚拟机的客户端. 我为他们分配了静态IP,这样就可以实现局域网通信了.注意代码中必须把监视线程的IsBac ...
- Android Paint之 setXfermode PorterDuffXfermode 讲解
setXfermodePorterDuffXfermode图层混合模式android图像混合模式AvoidXfermode 尊重原创,欢迎转载,转载请注明: FROM GA_studio htt ...
- Codeforces Round #256 (Div. 2/B)/Codeforces448B_Suffix Structures(字符串处理)
解题报告 四种情况相应以下四组数据. 给两字符串,推断第一个字符串是怎么变到第二个字符串. automaton 去掉随意字符后成功转换 array 改变随意两字符后成功转换 再者是两个都有和两个都没有 ...
- BNU10792:沙漠旅行者
有个旅行者计划横穿沙漠,沙漠中水资源很匮乏.旅行者需要依靠补给站的支持,才能横穿整个沙漠.假设所有的补给站都在一条直线上,而且旅行者一定沿着这条直线走.起点在1号补给站,终点在第N号补给站,起点和终点 ...
- Swift之高德地图自定义标注弹出气泡样式
在用到地图类的sdk,sdk自带的样式必定不能满足开发者的需求,于是开发者不得不进行自定义,由于官方同样是object-c 版语法,不得不将其转为swift语法,以满足项目需求. 新建两个类 Cust ...
- IntelliJ IDEA 的Project structure说明
IntelliJ IDEA 的Project structure可以在File->Project structure中打开,同时,在新建项目是IDE一般用向导的方式让你填写Project str ...
- jquery之onchange事件2
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- C# List 泛型用法
List 类是 ArrayList 类的泛型等效类,某些情况下,用它比用数组和 ArrayList 都方便. 我们假设有一组数据,其中每一项数据都是一个结构. public struct Item{ ...