日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發(fā)布時間:2025/4/16 windows 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt实现拖动一个lineEdit同时拖动mainwindow 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這個東西困擾了我很久,我一直在網(wǎng)上都沒有找到類似的方法。

方法:重寫類
有類似的方法,以前也是見過別人這么干的。
所以我就嘗試自己寫這個類。

先成功了一次:
我先在我的mainwindow中重寫了那個三個函數(shù)(mouseevent)。
具體方法可以點(diǎn)擊看這里
失敗了一次…:
我本來想,既然我能改寫這個mainwindow,那我為什么不自己直接改寫下我的LineEdit這樣我就可以實(shí)現(xiàn)了拖動我的LineEdit就可以拖動了我的整個框架。

我就直接將我上面寫的那三個函數(shù)移動到我的新寫的那那個myLineedit類中。
結(jié)果出乎意料的是…本來那個LineEdit是不能夠移動的,但是加上我的 設(shè)計的那個函數(shù)之后變成了可以移動的。
但問題是。。。lineedit移動,mainwindow不移動….心都碎了

但是作為一個IT行業(yè)的一員(就算我菜,那是算是啊!),一顆敢于與Bug決斗的心是一定要有!

于是我展開了多種嘗試。
在ui designer中,我看到了這個。

我突然意識到那個LineEdit的父親根本不是我一開始想的 MainWindow!!
他爺爺才是。
哈哈哈下面問題來,如何使用父組件的函數(shù)?

為什么要這么問,其實(shí)很簡答,只要將event傳給那個之前寫好的函數(shù)不就好了。

我只需要在子組件中寫傳event參數(shù)進(jìn)去給另外的那個父控件的mouse有關(guān)的事件函數(shù)就好了!!!

這個其實(shí)很簡單的。因?yàn)?this->parent()這函數(shù)就得到你父控件的指針!(為什么我這么確定,就是之前我試的時候,發(fā)現(xiàn)可以這么一路走上去!然后就可以找到它爺爺了!)

但是現(xiàn)在問題來了:
this->parent()->parent()->mouseMoveEvent(event);
直接這么寫有沒有問題?
肯定有問題啦!不然我會問咩?
哈哈哈 其實(shí)這個也好解釋,這里傳指針的時候,其實(shí)大家都不知道自己老爹會是什么類型的…但是為了實(shí)現(xiàn)很好的封裝,所以,在這傳的指針類型其實(shí)是
QObject *,所以,我們就需要強(qiáng)制類型轉(zhuǎn)換!

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

然后,當(dāng)我看到還有錯的時候,我很驚訝!what ?
這就是因?yàn)槲覀冊趌ineEdit中沒辦法使用父類的protected的函數(shù)??
不過改成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在構(gòu)造函數(shù)中))

#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); }

總結(jié)

以上是生活随笔為你收集整理的Qt实现拖动一个lineEdit同时拖动mainwindow的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。