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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

qt 拖拽 修改大小

發(fā)布時(shí)間:2025/5/22 编程问答 87 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt 拖拽 修改大小 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

寫次篇文章之前,qt窗口的放大縮小和拖拽我都是通過(guò)setGeometry方法實(shí)現(xiàn)的,但是作為windows程序,windows支持橡 皮筋式(拖拽時(shí)有一個(gè)虛框)拖拽和拉伸。通過(guò)setGeometry方式實(shí)現(xiàn)功能是沒(méi)有這種效果,幸好qt5中提供了一個(gè)本地事件處理接口 nativeEvent,具體功能可以看幫助文檔,本文只講述用該接口實(shí)現(xiàn)窗口放大、縮小和拖拽,具體實(shí)現(xiàn)代碼如下:

1 virtual bool nativeEvent(const QByteArray &, void *, long *) Q_DECL_OVERRIDE; 2 3 { 4 5 Q_UNUSED(eventType); 6 7 MSG* msg = reinterpret_cast(message); 8 9 if (winEvent(msg, result)) 10 11 { 12 13 return true; 14 15 } 16 17 else 18 19 { 20 21 return QWidget::nativeEvent(eventType, message, result); 22 23 } 24 25 } 26 27 如下方法是在qt事件循環(huán)之前調(diào)用的,如果返回值為true,則該事件循環(huán)不進(jìn)入qt事件循環(huán),否則進(jìn)入,result是一個(gè)輸出型參數(shù),我們可以通過(guò)賦值給result不同的值,來(lái)控制鼠標(biāo)的狀態(tài) 28 29 HTCAPTION:鼠標(biāo)可以拖拽 30 31 HTLEFT / HTRIGHT:鼠標(biāo)可以左右拖拽 32 33 HTTOP / HTBOTTOM:鼠標(biāo)可以上下拖拽 34 35 HTTOPLEFT / HTBOTTOMRIGHT:鼠標(biāo)可以左上或者右下拖拽 36 37 HTTOPRIGHT / HTBOTTOMLEFT:鼠標(biāo)可以右上或者左下拖拽 38 39 bool CCailianMainWindow::winEvent(MSG *message, long *result) 40 41 { 42 43 static int width = 4;//可檢測(cè)到鼠標(biāo)狀態(tài)的寬度 44 45 bool res = false; 46 47 if (isMaximized()) 48 49 { 50 51 return res; 52 53 } 54 55 switch (message->message) 56 57 { 58 59 case WM_NCHITTEST: 60 61 int xPos = GET_X_LPARAM(message->lParam) - this->frameGeometry().x(); 62 63 int yPos = GET_Y_LPARAM(message->lParam) - this->frameGeometry().y(); 64 65 if (QWidget * childW = this->childAt(xPos, yPos)) 66 67 { 68 69 if (childW == m_WindowTitle)//我自己的窗口頭,支持鼠標(biāo)拖拽 70 71 { 72 73 *result = HTCAPTION; 74 75 res = true; 76 77 } 78 79 } 80 81 else 82 83 { 84 85 return res; 86 87 } 88 89 if (xPos >= 0 && xPos < width) 90 91 { 92 93 *result = HTLEFT; 94 95 res = true; 96 97 } 98 99 if (xPos > (this->width() - width) && xPos < this->width()) 100 101 { 102 103 *result = HTRIGHT; 104 105 res = true; 106 107 } 108 109 if (yPos >= 0 && yPos < width) 110 111 { 112 113 *result = HTTOP; 114 115 res = true; 116 117 } 118 119 if (yPos > (this->height() - width) && yPos < this->height()) 120 121 { 122 123 *result = HTBOTTOM; 124 125 res = true; 126 127 } 128 129 if (xPos >= 0 && xPos < width && yPos >= 0 && yPos < width) 130 131 { 132 133 *result = HTTOPLEFT; 134 135 res = true; 136 137 } 138 139 if (xPos > (this->width() - width) && xPos < this->width() && yPos >= 0 && yPos < width) 140 141 { 142 143 *result = HTTOPRIGHT; 144 145 res = true; 146 147 } 148 149 if (xPos >= 0 && xPos < width && yPos >(this->height() - width) && yPos < this->height()) 150 151 { 152 153 *result = HTBOTTOMLEFT; 154 155 res = true; 156 157 } 158 159 if (xPos > (this->width() - width) && xPos < this->width() && yPos >(this->height() - width) && yPos < this->height()) 160 161 { 162 163 *result = HTBOTTOMRIGHT; 164 165 res = true; 166 167 } 168 169 } 170 171 return res; 172 173 } View Code 圖1 拖拽 圖2 修改大小?

如上圖所示,紅色箭頭指的就是拖拽和改變大小時(shí)出現(xiàn)的白色框

這樣處理后的標(biāo)題欄(m_WindowTitle)不能接受到mouseDoubleClickEvent事件,因此還需要自己手動(dòng)修改窗口大小,代碼如下,添加到上述swtich語(yǔ)句中

1 case WM_NCLBUTTONDBLCLK: 2 3 { 4 5 HWND hWnd = (HWND)this->winId(); 6 7 if (::IsZoomed(hWnd)) 8 9 { 10 11 ShowWindow(hWnd, SW_RESTORE); 12 13 } 14 15 else 16 17 { 18 19 ShowWindow(hWnd, SW_MAXIMIZE); 20 21 } 22 23 res = false; 24 25 } 26 27 break; View Code

注意:要支持windows的這種特性,需要通過(guò)代碼設(shè)置

showFullWindow:true代表拖動(dòng)和改變大小時(shí)窗口實(shí)時(shí)變化;false代表橡皮筋式放大,如上圖所示

SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, showFullWindow ? TRUE : FALSE, NULL, 0);

?

================================================

時(shí)隔10幾天,當(dāng)我測(cè)試新功能時(shí)發(fā)現(xiàn)一個(gè)問(wèn)題,特此記錄:

在xp系統(tǒng)上qt程序沒(méi)有任務(wù)欄菜單,但是win7和win10正常,給qt程序手動(dòng)添加?Qt::WindowSystemMenuHint屬性后,3系統(tǒng)都有菜單,但是nativeEvent方法不能放大縮小了,解決辦法暫時(shí)沒(méi)找到

====================================

今兒突然想到QMainWindow,這個(gè)右下角有一個(gè)可以支持放大做小的功能,最后看了源碼,發(fā)現(xiàn)由一個(gè)QSizeGrip類,這個(gè)類可以實(shí)現(xiàn)所在頂層 QWindow的放大和縮小,特此記錄?,此時(shí)結(jié)果如下圖3。這個(gè)類支持橡皮筋放大縮小,和前文所述nativeEvent實(shí)現(xiàn)效果相同

圖3 QSizeGrip實(shí)例

轉(zhuǎn)載于:https://www.cnblogs.com/swarmbees/p/5621543.html

總結(jié)

以上是生活随笔為你收集整理的qt 拖拽 修改大小的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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