Qt中,当QDockWidget的父窗口是一个不可以拖动的QTabWidget的时候实现拖动的方法

之前在做有关QDockWidget的内容时候遇到了瓶颈,那就是窗口弹出来之后拖动不了,也不可以放大和缩小,若是弹出来之后设置成了window的flags,也不可以拖动,而且也不是需要的效果。

1.弹出来之后的dockwidget的titlebar右边需要有3个按钮分别来控制放大与恢复、弹出来与收进去和关闭按钮。考虑到Qt自带的dockwidget弹出来后实现不了这个,所以参考了网上的方法,需要自己从QWidget中派生一个类来实现自己的titlebar

2.因为dockwidget是嵌套在QTabWidget中的,而tabwidget本身是不可以拖动的,所以此dockwiget也不可以拖动(Qt中子窗口的拖动是和父窗口有关联的),加上需要实现自己的dockwidget样式,所以也从QDockWidget中派生一个类

首先实现自己的titlebar:

 1 class myDockWidgetTitleBar:public QWidget
 2 {
 3     Q_OBJECT
 4
 5 private:
 6     //自己需要的类成员定义
 7     QSize sizeHint() const { return minimumSizeHint(); }
 8     QSize mimimumSizeHint() const;//在写自己的titlebar时,这2个函数必须要实现
 9
10 protected:
11     void paintEvent(QPaintEvent *event);
12     void mouseDoubleClickEvent(QMouseEvent *event);
13     void mouseReleaseEvent(QMouseEvent *event);
14
15 private slots:
16     //自己定义的一些槽函数,比如我这里需要实现放大缩小、浮动和关闭
17     void MaxMinDockWidget();
18     void FloatDockWidget();
19     void CloseDockWidget();
20
21 public:
22     myDockWidgetTitleBar(QWidget *parent = 0);
23     ~myDockWigetTitleBar();
24 };

这里需要注意的是:若dockwidget没有titlebar则直接setTitleBarWidget(QWidget());这样可以只有一个dockwidget的窗口而没有窗口上面的titlebar。(方法来源于网上,源地址找寻不到了,若是找到再加上原有链接)

下面写一下在实现titlebar时必须要实现的函数的实现:

 1 QSize *myDockWidgetTitleBar::minimumSizeHint() const
 2 {
 3     myDockWidget*dock_widget = qobject_cast<myDockWidget *>(parentWidget());
 4     Q_ASSERT(dock_widget != 0);
 5     QSize result(50, 30);
 6     if(dock_widget->features & QDockWidget::DockWidgetVerticalTitleBar)
 7     {
 8         result.transpose();
 9     }
10     return result;
11 }

paintEvent主要用来在titlebar上绘制图标和位置。不过我这里因为这些按钮其他地方也要用到,所以我将按钮都定义成了类成员,同时在构造函数中给出了按钮的类型。其他的slots函数可以根据需求定义就行。

实现自己的dockwidget:

 1 class myDockWidget:public QDockWidget
 2 {
 3     Q_OBJECT
 4
 5 private:
 6     //一些类成员变量
 7     int _cur_point_pos;
 8     int _margin_length;
 9     QWidget *_default_title_bar;
10     myDockWidgetTitleBar *_dock_widget_title_bar;
11
12 protected:
13     void mouseMoveEvent(QMouseEvent *event);//因为要实现拖动,所以这个鼠标移动事件必须要实现
14     void mousePressEvent(QMouseEvent *event);//拖动的时候鼠标左键应该是一直按压着的,所以需要在这个里面进行判断
15     void mouseReleaseEvent(QMouseEvent *event);
16     void closeEvent(QCloseEvent *event);
17
18 public:
19     myDockWidget(QTabWidget *tab_widget, QWidget *parent = 0);
20     ~myDockWidget();
21 };

需要注意的是这里的类定义中都用到了Q_OBJECT,若是在类中有信号和槽函数的定义,则必须要写此,具体的原因请参考Qt帮助手册。

上面的类中还需要定义一个用来判断鼠标左键是否一直按压着的bool变量和鼠标之前点击的位置信息:

1 private:
2     bool _left_mose_press;
3     Qpoint _last_point_pos, _length_pos;

鼠标按压事件中:

 1 void myDockWidget::mousePressEvent(QMouseEvent *event)
 2 {
 3     if(event->button == Qt::LeftButton)
 4     {
 5         _left_mouse_press = ture;
 6         _last_point_pos = event->globalPos();
 7         _cur_point_pos = CountFlag(event->pos(), CountColumn(event->pos()));
 8         event->ignore();
 9     }
10 }

鼠标释放事件中:

1 void myDockWidget::mouseReleaseEvent(QMouseEvent *event)
2 {
3     if(_left_mouse_press)
4     {
5          _left_mouse_press = false;
6     }
7     QApplication::restoreOverrideCursor();
8     event->ignore();
9 }

重点是这里的鼠标移动事件,这里处理的方法参考了【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动,并且这里里面有很详细的描述:有拖动窗口也有当鼠标放到四周显示不同形状进行放大缩小。这里将一个窗口划分成3*3的板块的方法还是不错的。

但是这里有一点不好的就是,每次拖动的时候都会重绘,若是窗口里面的内容比较复杂,当鼠标移动过快的时候便会出现窗口在某一个位置停下来了。这里还需要进一步的改进。

(移动窗口本身也有很多方法,但是考虑到要支持不同的平台,可能不能够只用到windows下的函数,所以选择了上面的方法,若只有windows平台,可以考虑下面的方法:

1. Qt窗口拖动及改变大小

2. Qt 无标题无边框程序的拖动和改变大小

3. 【Qt】移动无边框窗体

这些都是我当时查找到的一些方法,其实网上的方法大多也都是类似的,当然如果能够一个一个的看demo中的例子,就会发现其实Qt的源代码中也有类似的操作,网上的方法和Qt例子中的都大同小异)

当然Qt中也有获取当前屏幕大小的函数,这个可用来处理放大和缩小的时候看要到什么大小:

1 QRect desktop_rect = QApplication::desktop()->availableGeometry();
时间: 2024-10-23 13:19:20

Qt中,当QDockWidget的父窗口是一个不可以拖动的QTabWidget的时候实现拖动的方法的相关文章

QT中关闭应用程序和窗口的函数(quit(),exit()以及close()的区别)

使用QT编辑界面,其中带来很大方便的一点就是Qt中自带丰富的.种类齐全的类及其功能函数,程序员可以在编辑程序的过程中简单地直接调用.关于窗口关闭的操作,在这里指出常用的三个槽,即quit(),exit()以及close().    首先说明窗口退出时,系统提示对话框的代码编辑.对主程序的退出,可以调用成员函数exit(),同时也可以调用槽quit(),二者此时都能起到关闭应用程序的作用.只是应注意二者调用的方式不同.如下程序示例:        {         QApplication* a

QT+创建两个不相干的窗口实现一个显示一个不显示

因为两个窗口互不相干,所以需要重新创建一个窗口类subWidget subWidget.cpp文件 #ifndef SUBWIDGET_H #define SUBWIDGET_H #include <QWidget> #include <QPushButton> class SubWidget : public QWidget { Q_OBJECT public: explicit SubWidget(QWidget *parent = 0); void sendSlot(); s

js中父窗口获得模态窗口的返回值

<!--父窗口JS--> //查看审核详细 function viewFlow() {          var strBackValue= openWin('../VertifyView.aspx?&rn=' + Math.random()+'&View='+strValue, 630, 180);//这里的strBackValue就是模态窗口的返回值 alert(strBackValue) } //弹窗 function openWin(url, width, height

JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作

一.Iframe 篇 公共部分 //父对象得到子窗口的值 //ObjectID是窗口标识,ContentID是元素ID function GetValue(ObjectID,ContentID) { var IsIE = (navigator.appName == 'Microsoft Internet Explorer') if(IsIE) {//如果是IE alert(document.frames(ObjectID).document.getElementById(ContentID).i

窗口,父窗口parentwindow,所有者窗口ownerwindow

参考文档:http://www.cnblogs.com/fwycmengsoft/p/4026592.html 一. parent:创建者,owner:所有者 小玉的父母生下小玉,养到8岁,卖给贾府当丫头小玉的父母是parent,贾府是owner 二. 1.Pop-up窗口: 一个弹出窗口是必须具有WS_POPUP属性的窗口,弹出窗口只能是一个Top-Level窗口,不能是子窗口,弹出窗口多用于对话框和消              息框,也可以用于应用程序的主窗口, 弹出窗口可以不必具有标题栏

mfc窗口,父窗口parentwindow,所有者窗口ownerwindow 区别

mfc窗口,父窗口parentwindow,所有者窗口ownerwindow 区别 1.理解窗口之间的关系   2.   如何设置(创建)不同的窗口 一. parent:创建者,owner:所有者 小玉的父母生下小玉,养到8岁,卖给贾府当丫头小玉的父母是parent,贾府是owner 二. 1.Pop-up窗口: 一个弹出窗口是必须具有WS_POPUP属性的窗口,弹出窗口只能是一个Top-Level窗口,不能是子窗口,弹出窗口多用于对话框和消              息框,也可以用于应用程序的

Qt中内存泄露和退出崩溃的问题 delete

Qt中帮程序员做了一些内存回收的事情,但正因为这些反而让对此不熟悉的人会屡屡犯错. 收录一篇不错的文章: 在C++中学习过程中,我们都知道: delete 和 new 必须 配对使用(一 一对应):delete少了,则内存泄露,多了麻烦更大. Qt作为C++的库,显然是不会违背C++的前述原则的.可是: 在Qt中,我们很多时候都疯狂地用new,却很少用delete,缺少的 delete 去哪儿了?! 注:本文暂不涉及智能指针(smart pointer)相关的东西,你可以考虑 Qt 智能指针学习

总结js(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作

http://hi.baidu.com/yashua839/blog/item/131fdb2fe547ef221f3089af.html一.Iframe 篇 //&&&&&&&&&&&&&&&&&&&&公共方法开始&&&&&&&&&&&&&&a

二级弹窗将数据传递到父窗口

1.想象一个业务场景:1.1 在流程的个人办理页面中填写处理意见,点击个人意见按钮弹出二级弹窗,查询该用户的所有的个人常用语.1.2 用户选取一条常用语,触发一个动作,获取当前点击的元素的文本,并调用父窗口的一个方法,将选取的常用语加入到父窗口的处理意见的文本域里. 2.实现的思路:通过调用父窗口的一个方法,将需要传递的值做方法的参数. 原文地址:https://www.cnblogs.com/chentu279203653/p/9447274.html