欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

Qt实现拖动一个lineEdit同时拖动mainwindow,lineeditmainwindow

来源: 开发者 投稿于  被查看 186 次 评论:101

Qt实现拖动一个lineEdit同时拖动mainwindow,lineeditmainwindow


这个东西困扰了我很久,我一直在网上都没有找到类似的方法。

方法:重写类
有类似的方法,以前也是见过别人这么干的。
所以我就尝试自己写这个类。

先成功了一次:
我先在我的mainwindow中重写了那个三个函数(mouseevent)。
具体方法可以点击看这里
失败了一次…:
我本来想,既然我能改写这个mainwindow,那我为什么不自己直接改写下我的LineEdit这样我就可以实现了拖动我的LineEdit就可以拖动了我的整个框架。

我就直接将我上面写的那三个函数移动到我的新写的那那个myLineedit类中。
结果出乎意料的是…本来那个LineEdit是不能够移动的,但是加上我的 设计的那个函数之后变成了可以移动的。
但问题是。。。lineedit移动,mainwindow不移动….心都碎了

但是作为一个IT行业的一员(就算我菜,那是算是啊!),一颗敢于与Bug决斗的心是一定要有!

于是我展开了多种尝试。
在ui designer中,我看到了这个。

我突然意识到那个LineEdit的父亲根本不是我一开始想的 MainWindow!!
爷爷才是。
哈哈哈下面问题来,如何使用父组件的函数?

为什么要这么问,其实很简答,只要将event传给那个之前写好的函数不就好了。

我只需要在子组件中写传event参数进去给另外的那个父控件的mouse有关的事件函数就好了!!!

这个其实很简单的。因为 this->parent()这函数就得到你父控件的指针!(为什么我这么确定,就是之前我试的时候,发现可以这么一路走上去!然后就可以找到它爷爷了!)

但是现在问题来了:
this->parent()->parent()->mouseMoveEvent(event);
直接这么写有没有问题?
肯定有问题啦!不然我会问咩?
哈哈哈 其实这个也好解释,这里传指针的时候,其实大家都不知道自己老爹会是什么类型的…但是为了实现很好的封装,所以,在这传的指针类型其实是
QObject *,所以,我们就需要强制类型转换!

我的策略就是这样子的~
QuickSearch *p = (QuickSearch *)this->parent()->parent();

然后,当我看到还有错的时候,我很惊讶!what ?
这就是因为我们在lineEdit中没办法使用父类的protected的函数??
不过改成public:就万事大吉了!

对了还有个小tip:

  • 在designer那选中你继承的对象(比如我想要把一个一般的lineedit变成我想要的那种, 那我就选任何一个lineedit,然后右键提升,在输入那,就写类名!!一定要写全名!)然后就可以用定义的控件啦!

  • 记得要初始化那个mMoving为false。不然可能会乱飘~hhhh

演示gif

.h文件

#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H
#include <QLineEdit>
#include <QWidget>
#include <QMouseEvent>
#include "quicksearch.h"
class myLineEdit: public QLineEdit
{
    Q_OBJECT
public:
    myLineEdit(QWidget* parent=0);
protected:
    void mouseMoveEvent(QMouseEvent* event);
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
private:
    bool mMoving;
};

#endif // MYLINEEDIT_H

cpp文件(主要还是那三个代码(记得要写 mMoving = false在构造函数中))

#include "mylineedit.h"
#include<QDebug>
myLineEdit::myLineEdit(QWidget *parent) :
    QLineEdit(parent)
{
    mMoving = false;
}

void myLineEdit::mouseMoveEvent(QMouseEvent* event){
    QuickSearch *p = (QuickSearch *)this->parent()->parent();
    p->mouseMoveEvent(event);
}

void myLineEdit::mousePressEvent(QMouseEvent* event){
    QuickSearch *p = (QuickSearch *)this->parent()->parent();
    p->mousePressEvent(event);
}

void myLineEdit::mouseReleaseEvent(QMouseEvent* event){
    QuickSearch *p = (QuickSearch *)this->parent()->parent();
    p->mouseReleaseEvent(event);
}
查看评论
相关频道:

用户评论