1. 程式人生 > >Qt基礎 設計自動適應視窗大小

Qt基礎 設計自動適應視窗大小

實際qt視窗程式的時候,為了方便和程式本身能自適應顯示裝置,我們一般都要把控制元件設計為可以隨視窗大小的改變而改變,在使用設計助手

設計的介面,預設是不能隨視窗大小改變而改變的,只需做一下簡單處理即可.一下是轉載前輩們的部落格.

轉載地址:http://www.cnblogs.com/linmeng/archive/2012/07/05/2559259.html

在windows下的qt設計師中只需選擇: 窗體->垂直佈局  或者  窗體->水平佈局 就可以實現,在別的環境中可以用一下方法實現 仙人掌的程式碼: 在建構函式中: ui.setupUi(this);
ui.centralWidget->setLayout(ui.topverticalLayout);

我們知道,通過Qt的各種Layout可以實現控制元件的自動佈局。

但是在使用Qt Designer建立的UI時,發現UI始終是設計時的樣子,無法隨著容器的放大縮小自適應地變化。

通過之前對ui的.h檔案進行分析,我們知道Qt在生成ui程式碼時,根據最外層的Layout自動新增一個了Widget:

   /** 這個Widget在UI設計時是沒有的,是Qt為了方便組合其他的元件而且自動建立的。
    Widget的名字是根據最外層的元件來的,這裡最外層是一個QVBoxLayout元件,故Widget
    以VerticalLayoutWidget命名*/
    QWidget *verticalLayoutWidget;

而我們在setupUi時,將 verticalLayoutWidget 指定為目標窗體的子控制元件,而 verticalLayoutWidget 的大小是已經固定了的,如下:

      //建立myQtTestForm的Child Widget,
        verticalLayoutWidget = new QWidget(myQtTestForm);
        verticalLayoutWidget->setObjectName(QString::fromUtf8("verticalLayoutWidget"));
        verticalLayoutWidget->setGeometry(QRect(20, 20, 491, 311));

所以, verticalLayoutWidget 不會隨父視窗的放大縮小而變化。

解決辦法就是,把 verticalLayoutWidget 放在目標窗體的Layout中,程式碼如下:

複製程式碼
    //設定Ui
    ui.setupUi(this);

    //使Ui可自適應父視窗大小
    QVBoxLayout* mainLayout = new QVBoxLayout;
    mainLayout->addWidget(ui.verticalLayoutWidget);
    setLayout(mainLayout);
複製程式碼

好了,就這麼簡單!

手動寫程式碼,使用layout管理,轉載地址為:http://blog.csdn.net/xgbing/article/details/7764326

 開發一個圖形介面應用程式,介面的佈局影響到介面的美觀。在設計一個介面之前,應該考慮到開發的介面可能給不用的使用者使用,而使用者的螢幕大小、縱橫比例、解析度可能不同,介面還可能是可縮放的,程式應該可以適應這些變化。

        前面的程式中都是使用setGeometry()方法定位控制元件的位置,這個方法比較笨拙。試想如果控制元件很多,佈局這些控制元件需要編寫大量的程式碼。幸運的是,QT提供了更好的方法佈局控制元件。

        常用的三種佈局方法:

(1)使用水平佈局類QHBoxLayout;

(2)使用垂直佈局類QVBoxLayout;

(3)使用網格佈局類QGridLayout。

這三種方法可以巢狀使用。

控制元件在佈局時可以先不指定父視窗,最後交由Layout統一指定。

示例:

  1. #include <QApplication>
  2. #include <QDialog>
  3. #include <QPushButton>
  4. #include <QLineEdit>
  5. #include <QLayout>
  6. #include <QLabel>
  7. int main(int argc, char *argv[])  
  8. {  
  9.     QApplication a(argc, argv);  
  10.     QDialog *mainWindow = new QDialog;  
  11.     QHBoxLayout *topLayout = new QHBoxLayout;  
  12.     QLabel *lbl = new QLabel(QWidget::tr("&Input:"), mainWindow);  
  13.     QLineEdit *lineEdt = new QLineEdit(mainWindow);  
  14.     lbl->setBuddy(lineEdt);  
  15.     topLayout->addWidget(lbl);  
  16.     topLayout->addWidget(lineEdt);  
  17.     QHBoxLayout *bomLayout = new QHBoxLayout;  
  18.     QPushButton *btn_ok = new QPushButton(QWidget::tr("OK"), mainWindow);\  
  19.     btn_ok->setDefault(true);  
  20.     QPushButton *btn_cancel = new QPushButton(QWidget::tr("Cancel"), mainWindow);  
  21.     bomLayout->addStretch();  
  22.     bomLayout->addWidget(btn_ok);  
  23.     bomLayout->addStretch();  
  24.     bomLayout->addWidget(btn_cancel);  
  25.     bomLayout->addStretch();  
  26.     QVBoxLayout *mainLayout = new QVBoxLayout;  
  27.     mainLayout->addLayout(topLayout);  
  28.     mainLayout->addLayout(bomLayout);  
  29.     mainWindow->setLayout(mainLayout);  
  30.     mainWindow->resize(300, 100);  
  31.     mainWindow->setWindowTitle(QWidget::tr("Qt Test"));  
  32.     mainWindow->show();  
  33.     return a.exec();  
  34. }  


編譯執行,介面如下:

在介面中,最外部是mainLayout,它的型別是垂直佈局類QVBoxLayout。它包含了兩個水平佈局類QHBoxLayout,分別是topLayout和bomLayout。

比起QHBoxLayout和HVBoxLayout, QGridLayout運用更加靈活。

QGridLayout的常用方法

(1)addWidget:

  1. //放置一個控制元件到一個單元格
  2. void    addWidget ( QWidget * widget, int row, int column, Qt::Alignment alignment = 0 )  
  3. //如果放置的控制元件超出一個單元格,則使用該方法
  4. void    addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 )  

    1)row:指放置控制元件的網格行號(行號從0開始);

    2)colum:指放置控制元件的網格列號(從0開始);

    3)alignment:對齊方式。

    4)fromRow:指放置控制元件的起始網格行號;

    5)fromColumn:指放置控制元件的起始網格列號;

    6)rowSpan:指放置控制元件佔多少行;

    7)columnSpan:指放置控制元件佔多少列。


(2)addLayout

  1. void    addLayout ( QLayout * layout, int row, int column, Qt::Alignment alignment = 0 )  
  2. void    addLayout ( QLayout * layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 )  

引數與addWidget類似。

(3)setSpacing

  1. void QGridLayout::setSpacing ( int spacing )  

設定控制元件水平和垂直之間的間隔。

示例:

  1. #include <QApplication>
  2. #include <QDialog>
  3. #include <QPushButton>
  4. #include <QLineEdit>
  5. #include <QLayout>
  6. #include <QLabel>
  7. #include <QTextEdit>
  8. int main(int argc, char *argv[])  
  9. {  
  10.     QApplication a(argc, argv);  
  11.     QDialog *mainWindow = new QDialog;  
  12.     QGridLayout *gridLayout = new QGridLayout;  
  13.     gridLayout->setColumnStretch(0, 1);  
  14.     gridLayout->setColumnStretch(1, 4);  
  15.     gridLayout->setColumnStretch(2, 1);  
  16.     gridLayout->setColumnStretch(3, 1);  
  17.     gridLayout->setColumnStretch(4, 4);  
  18.     gridLayout->setMargin(15);  
  19.     gridLayout->setColumnMinimumWidth(2, 15);  
  20.     QLabel *lbl1 = new QLabel(QWidget::tr("First Name:"));  
  21.     QLineEdit *edit1 = new QLineEdit;  
  22.     QLabel *lbl2 = new QLabel(QWidget::tr("Last Name:"));  
  23.     QLineEdit *edit2 = new QLineEdit;  
  24.     QLabel *lbl3 = new QLabel(QWidget::tr("Sex:"));  
  25.     QLineEdit *edit3 = new QLineEdit;  
  26.     QLabel *lbl4 = new QLabel(QWidget::tr("Birthday:"));  
  27.     QLineEdit *edit4 = new QLineEdit;  
  28.     QLabel *lbl5 = new QLabel(QWidget::tr("Address:"));  
  29.     QTextEdit *textEdt = new QTextEdit;  
  30.     gridLayout->addWidget(lbl1, 0, 0);  
  31.     gridLayout->addWidget(edit1, 0, 1);  
  32.     gridLayout->addWidget(lbl2, 0, 3);  
  33.     gridLayout->addWidget(edit2, 0, 4);  
  34.     gridLayout->addWidget(lbl3, 1, 0);  
  35.     gridLayout->addWidget(edit3, 1, 1);  
  36.     gridLayout->addWidget(lbl4, 1, 3);  
  37.     gridLayout->addWidget(edit4, 1, 4);  
  38.     gridLayout->addWidget(lbl5, 2, 0);  
  39.     gridLayout->addWidget(textEdt, 3, 0, 2, 5);  
  40.     mainWindow->setLayout(gridLayout);  
  41.     mainWindow->resize(400, 150);  
  42.     mainWindow->setWindowTitle(QWidget::tr("Qt Test"));  
  43.     mainWindow->show();  
  44.     return a.exec();  
  45. }  


編譯執行,介面如圖:


相關推薦

Qt基礎 設計自動適應視窗大小

實際qt視窗程式的時候,為了方便和程式本身能自適應顯示裝置,我們一般都要把控制元件設計為可以隨視窗大小的改變而改變,在使用設計助手 設計的介面,預設是不能隨視窗大小改變而改變的,只需做一下簡單處理即可.一下是轉載前輩們的部落格. 轉載地址:http://www.cn

easyui Layout 自動適應視窗大小

(2012-04-17注:easyui新版本layout已經有fit屬性,不用這麼麻煩) 一個小小的應用 一、使用asp.net 自帶的form; 二、用div代替asp.net 自帶的form; 開發工具:VS2008 框架:jquery-easyui-1.

Qt基礎——自適應視窗大小

我們知道,通過Qt的各種Layout可以實現控制元件的自動佈局。 但是在使用Qt Designer建立的UI時,發現UI始終是設計時的樣子,無法隨著容器的放大縮小自適應地變化。 通過之前對ui的.h檔案進行分析,我們知道Qt在生成ui程式碼時,根據最外層的Layout自動新增一個了Widget: /

qt 時鐘設計(隨介面大小變動自適應

demo連結:https://download.csdn.net/download/weixin_39841821/10568854 一、 需求 a) 畫出一個圓形錶盤,包含三角形的時針、分針、秒針,以及上方的刻度,加上名字 b) 在窗體發生變化的時候,時鐘能夠根據窗體大小自動調整

QT程式自適應視窗大小

作為QT菜鳥的一員,總是容易遇到各種問題,然後歷經千辛萬苦解決它 問題: 我的程式需要在ARM板(Linux系統)上跑,也需要在PC(Windows上)跑,他們擁有不同大小的螢幕 在程式中佈局的介面能夠很好地適應視窗的大小變化,但是在UI設計中則不能實現 原因:在UI設計中沒有進

如何使圖片尺寸自動適應視窗,隨視窗大小變化而變化

程式碼如下: <img src="{{ url_for('static', filename=picture.piclink) }}" alt=""

Qt Creator 窗體控制元件自適應視窗大小布局

常見的軟體視窗大小改變(最大化、手動改變時)需要視窗的部件能夠自適應佈局,而在Qt的應用程式介面設計中,對於像我一樣的初學者如何實現視窗自適應調整還是要繞點彎路的。網上百度了很多,多數說的很含糊,還有很多是用程式實現的,既然已經有Qt Creator那麼高整合度的工具了,我還是傾向於直接在Qt Crea

Qt中窗體控制元件按照比例縮放,自適應視窗大小進行佈局

    最近在做本科畢設,用到了Qt,無奈本人實在是太過於小白了,很多東西都進行了很久的探索,比如今天說到的窗體控制元件佈局...一把辛酸淚     首先就是建立一個GUI檔案,然後進行UI設計,這裡就只需要從左邊進行拖拽,這個很easy啦...     然後對其進行佈局

使背景圖片自動適應窗體大小

實現效果:    知識運用:   窗體的BackgroundImage和BackgroundImageLayout屬性    public virtual Image BackgroundImage{get; set;}    //屬性值 一個Image影象    public virtu

easyUI Layout自適應視窗大小

</pre><p>關於頁面自適應效果</p><p><pre name="code" class="javascript">//監聽視窗大小變

QGraphicsView使影象自適應視窗大小

fd=QFileDialog(self) filePath=fd.getOpenFileName()[0] item=QGraphicsPixmapItem(QPixmap(filePath)) scene=QGraphicsScene() scene.addItem

選項卡Tabs 設定自適應視窗大小

$(window).resize(function() {     //"_tabs" 為easyui-tabs的id     $('#_tabs').tabs({         width : $

JQuery EasyUI Layout 在from佈局自適應視窗大小

在JQuery EasyUI中,如果直接在form上佈局時當視窗大小調整佈局不會改變,將佈局應用於body時中間隔著一個form,橫豎不好弄。 網上有多個解決方案,一般都是寫程式碼,在視窗大小改變時設定佈局。 經實驗,新版本的JQuery EasyUI中佈局可以採用以下方

使lightbox2 的彈出的大圖片自動適應螢幕大小

  Resize the image to the screen: lightbox.js: preloader.onload = function() { $image.attr('src', _this.album[_this.currentImageIndex].link); $image.width

Echarts 如何設定多個圖表自適應視窗大小

最近做了Echarts的一些東西 碰到一個很實際的問題  那就是如何使Echarts圖表能自適應視窗的大小 由於我一個頁面里加載了四個圖 所以用一般的  window.onresize = myCha

一個頁面存在多個echarts圖形,resize失效,圖形自適應視窗大小

當一個頁面有兩個echarts圖形,想要頁面大小發生改變,重新繪製圖形如果還寫為                   myChart.se

11three.js自適應視窗大小

新增一個監控事件 window.addEventListener image.png function onResize() {

window.onload and showModalDialog根據內容自動調整視窗大小

 1 showModalDialog根據內容自動調整視窗大小 :在對話方塊的頁面中加入如下程式碼: window.onload = function()      { if( document.body.scrollWidth > (window.screen.ava

echarts學習總結(二):一個頁面存在多個echarts圖形,圖形自適應視窗大小

如上圖所示一個頁面有兩個echarts圖形:散點圖和折線圖,如果還寫為                   myChart.setOption(option);                 window.onresize = myChart.resize; 則只有

PyQt5 QTableWidget(表單控制元件)自適應視窗大小、欄位大小調整及佈局(一)

目錄 前言 前言 還好,我有C++ Qt Help(幫助文件)O(∩_∩)O哈哈~ 本文旨在介紹QTableWidget(表單控制元件)的自適應視窗大小、欄位大小調整及佈局。 用QtDesigner設計UI 1. 先用QtDe