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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt-手动布局

發布時間:2023/12/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt-手动布局 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡述

手動布局,可以實現和水平布局、垂直布局、網格布局等相同的效果,也可實現屬于自己的自定義布局,當窗體縮放時,控件可以隨之變化。

其對于坐標系的建立有嚴格要求,純代碼思維,使用復雜,不易維護,所以一般不建議使用。

下面我們以簡單的例子來講解如何使用。

  • 簡述
  • 事件
  • 垂直布局
    • 簡略圖
    • 效果
    • 源碼
  • 水平布局
    • 效果
    • 源碼
  • 總結


事件

在Qt之布局管理器一節中,我們介紹了對于手動布局的實現思路。

通過QWidget::resizeEvent()來計算所需要分配的大小,并且給每個子控件調用setGeometry()。


垂直布局


簡略圖

我們先簡單看一個簡略圖,是一個一個垂直布局的界面,包含各個部位的組成以及大小限制。

其中Left Margin、Top Margin、Right Margin、Bottom Margin分別指各個控件距離窗體的左、上、右、下外邊距,Spacing指控件之間的間距。


效果


源碼

  • void MainWindow::resizeEvent(QResizeEvent *event)

  • {

  • QWidget::resizeEvent(event);

  • int nSpacing = 10;

  • int nLeft = 10;

  • int nTop = 10;

  • int nRight = 10;

  • int nBottom = 10;

  • // 標簽位置、大小

  • m_pLabel->setGeometry(nLeft, nTop, width() - nLeft - nRight, 20);

  • // 按鈕大小

  • m_pButton->setFixedSize(75, 25);

  • // 設置按鈕位置

  • m_pButton->move(width() - m_pButton->width() - nRight, height() - nBottom - m_pButton->height());

  • // 中央窗體位置、大小

  • m_pCentralWidget->setGeometry(nLeft, nTop + nSpacing + m_pLabel->height(),

  • width() - nLeft - nRight, height() - nTop - 2 *nSpacing - m_pLabel->height() - m_pButton->height() - nBottom);

  • }

  • 標簽和中央窗體的寬度均為:width() - nLeft - nRight,即:窗體寬度 - 左邊距 - 右邊距。

    標簽的坐標為QPoint(nLeft, nTop),即:x為左邊距,y為上邊距。

    中央窗體的坐標為:QPoint(nLeft, nTop + nSpacing + m_pLabel->height()),即:x:左邊距,y:上邊距 + 間距 + 標簽高度。

    中央窗體的高度為:height() - nTop - 2?nSpacing - m_pLabel->height() - m_pButton->height() - nBottom。即:窗體高度 - 上邊距 - 標簽高度 - 按鈕高度 - 下邊距 - 2?間距。

    按鈕大小為:QSize(75, 25),即:width:75,height:25。

    按鈕位置:QPoint(width() - m_pButton->width() - nRight, height() - nBottom - m_pButton->height())。即:x:窗體寬度 - 按鈕寬度 - 右邊距,y:窗體高度 - 按鈕高度 - 下邊距。


    水平布局

    實現思路不再過多講解,參考垂直布局。


    效果


    源碼

  • void MainWindow::resizeEvent(QResizeEvent *event)

  • {

  • QWidget::resizeEvent(event);

  • int nSpacing = 10;

  • int nLeft = 10;

  • int nTop = 10;

  • int nRight = 10;

  • int nBottom = 10;

  • m_pLeftButton->setFixedSize(75, 25);

  • m_pCentralButton->setFixedSize(75, 25);

  • m_pRightButton->setFixedSize(75, 25);

  • // 居左

  • //m_pLeftButton->move(nLeft, nTop);

  • //m_pCentralButton->move(nLeft + m_pLeftButton->width() + nSpacing, nTop);

  • //m_pRightButton->move(nLeft + m_pLeftButton->width() + m_pCentralButton->width() + 2 * nSpacing, nTop);

  • // 居右

  • m_pRightButton->move(width() - m_pRightButton->width() - nRight, nTop);

  • m_pCentralButton->move(width() - m_pCentralButton->width() - m_pRightButton->width() - nSpacing - nRight, nTop);

  • m_pLeftButton->move(width() - m_pLeftButton->width() - m_pCentralButton->width() - m_pRightButton->width() - 2 * nSpacing - nRight, nTop);

  • }


  • 總結

    好了,關于網格布局或其他復雜布局就不再一一介紹了,主要計算好各個控件的相對坐標即可。

    有人肯定會有疑惑,為什么不使用setGeometry(10, 10, 100, 75),而必須通過resizeEvent()來計算坐標呢?

    主要區別:

    • setGeometry(10, 10, 100, 75)采用絕對坐標和位置,適用于窗體大小固定的情況。一旦大小發生變化,則無計可施。

    • resizeEvent()計算坐標屬于相對位置,無論窗體如何變化,都可以適應其在窗體中的布局。

    總結

    以上是生活随笔為你收集整理的Qt-手动布局的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。