1. 程式人生 > >【Qt】之 Splitter分割視窗

【Qt】之 Splitter分割視窗

中英文對照Splitter handles(分隔條)

 一個QSplitter控制元件中可以包含其他控制元件,這些控制元件被一個分隔條隔開,託拽這個分隔條,裡面的控制元件的大小可以改變。QSplitter控制元件經常做為佈局管理器使用,給使用者提供更多的介面控制。

QSplitter控制元件中的子控制元件總是按順序自動並肩排列(或者上下排列)。相鄰的控制元件之間有一個分隔條。下面是建立圖6.7的窗體的程式碼: int main(int argc, char *argv[]) {     QApplication app(argc, argv);     QTextEdit *editor1 = new QTextEdit;     QTextEdit *editor2 = new QTextEdit;     QTextEdit *editor3 = new QTextEdit;     QSplitter splitter(Qt::Horizontal);     splitter.addWidget(editor1);     splitter.addWidget(editor2);     splitter.addWidget(editor3);     ...     splitter.show();     return app.exec(); } Figure 6.7. The Splitter application

   這個例子中的窗體有一個QSplitter控制元件,其中有三個水平排列的QTextEdit控制元件,和佈局管理器不同,QSplitter不但可以排列子控制元件,還有一個可視的外觀,QSplitter控制元件從QWidget繼承,擁有QWidget所有的功能。

Figure 6.8. The Splitter application's widgets 第一次是呼叫rightSplitter的setStretchFactor,把索引值為1的控制元件(textEdit)的拉伸係數設定為1,第二次是呼叫mainSplitter的setStretchFactor(),設定控制元件rightSplitter的拉伸係數為1。這樣,textEdit控制元件就能夠得到儘可能多餘的空間。 當應用程式啟動時,QSplitter根據子控制元件的初始尺寸或者sizeHint合理分配每一個子控制元件的大小。程式中,我們可以呼叫QSplitter::setSizes()改變分隔條的位置。QSplitter還可以儲存當前的狀態,在程式下一次執行時恢復以前的狀態。下面是writeSettings()函式,儲存當前分隔條的狀態: void MailClient::writeSettings() {     QSettings settings("Software Inc.", "Mail Client");     settings.beginGroup("mainWindow");     settings.setValue("size", size());     settings.setValue("mainSplitter", mainSplitter->saveState());     settings.setValue("rightSplitter", rightSplitter->saveState());     settings.endGroup(); } 下面是相應的readSettings()函式: void MailClient::readSettings() {     QSettings settings("Software Inc.", "Mail Client");     settings.beginGroup("mainWindow");     resize(settings.value("size", QSize(480, 360)).toSize());     mainSplitter->restoreState(             settings.value("mainSplitter").toByteArray());     rightSplitter->restoreState(             settings.value("rightSplitter").toByteArray());     settings.endGroup(); } Qt Designer也支援QSplitter。把子控制元件放到合適的位置,把他們選中,選擇選單Form|Lay out Horizontally in Splitter或者Form|Lay out Verticallly in Splitter,所選擇的子控制元件就被加入到QSplitter控制元件中。 對QSplitter進行水平或者垂直巢狀可以實現更加複雜的佈局。例如,圖6-9所示的MailClient程式中,就是一個垂直方向的QSplitter控制元件中嵌套了一個水平方向的QSplitter控制元件。 Figure 6.9. The Mail Client application on Mac OS X
下面的程式碼是MailClient程式的主視窗類建構函式程式碼: MailClient::MailClient() {     ...     rightSplitter = new QSplitter(Qt::Vertical);     rightSplitter->addWidget(messagesTreeWidget);  //索引0     rightSplitter->addWidget(textEdit);//索引1     rightSplitter->setStretchFactor(1, 1);//指定索引為1的textEdit拉伸     mainSplitter = new QSplitter(Qt::Horizontal);     mainSplitter->addWidget(foldersTreeWidget);     mainSplitter->addWidget(rightSplitter);     mainSplitter->setStretchFactor(1, 1);     setCentralWidget(mainSplitter);     setWindowTitle(tr("Mail Client"));     readSettings(); } 建立完我們所需要顯示三個控制元件(messageTreeWidget,textEdit,foldersTreeWidget)後,我們建立一個垂直的QSplitter,rightSplitter控制元件,把messageTreeWidget和textEdit控制元件加到rightSplitter中。然後建立一個水平的QSplitter,mainSplitter控制元件,把rightSplitter和foldersTreeWidget加入到mainSplitter中。把mainSplitter做為QMainWindow的中央控制元件。 當用戶改變視窗的大小時, QSplitter通常給所有的子控制元件一樣的空間。在MailClient程式中,我們希望左邊的檔案樹控制元件(foldersTreeWidget)和訊息樹控制元件(messageTreeWidget)保持它們的大小,把其他的空間都分配給QTextEdit。這由兩個setStretchFactor()呼叫實現。第一個引數是0開始的子控制元件的索引值,第二個引數為我們設定的拉伸係數,預設值為0。 Figure 6.10. The Mail Client's splitter indexing
測試程式碼:
  1. QList<QTreeWidgetItem *> items;  
  2.     for (int i = 0; i < 10; ++i)  
  3.         items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i))));  
  4.     QTreeWidget* messagesTreeWidget = new QTreeWidget();  
  5.     messagesTreeWidget->setColumnCount(1);  
  6.     messagesTreeWidget->insertTopLevelItems(0, items);  
  7.     for (int i = 0; i < 10; ++i)  
  8.         items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i))));  
  9.     QTreeWidget* foldersTreeWidget = new QTreeWidget();  
  10.     foldersTreeWidget->setColumnCount(1);  
  11.     foldersTreeWidget->insertTopLevelItems(0, items);  
  12.     QTextEdit* textEdit = new QTextEdit();  
  13.     textEdit->setText(tr("happy"));  
  14.     QSplitter* rightSplitter = new QSplitter(Qt::Vertical);  
  15.     rightSplitter->addWidget(messagesTreeWidget);   //索引0
  16.     rightSplitter->addWidget(textEdit);             //索引1
  17.     rightSplitter->setStretchFactor(1, 1);          //索引為X的控制元件拉伸
  18.     QSplitter* mainSplitter = new QSplitter(Qt::Horizontal);  
  19.     mainSplitter->addWidget(foldersTreeWidget);  
  20.     mainSplitter->addWidget(rightSplitter);  
  21.     mainSplitter->setStretchFactor(1, 1);  
  22.     setCentralWidget(mainSplitter);  
拉伸前:
   拉伸後

FROM:  http://blog.csdn.net/teng_ontheway/article/details/18262827

相關推薦

Qt Splitter分割視窗

中英文對照Splitter handles(分隔條)  一個QSplitter控制元件中可以包含其他控制元件,這些控制元件被一個分隔條隔開,託拽這個分隔條,裡面的控制元件的大小可以改變。QSplitter控制元件經常做為佈局管理器使用,給使用者提供更多的介面控制。

Qt 學習路---安裝篇QT5.7.1+VS2013軟體開發環境配置

參考:https://blog.csdn.net/liushuiwen101423/article/details/70882534 安裝任務:完成Qt5.7.1載入到VS2013環境下,程式設計執行Qt應用程式,有詳細步驟,最後完成一個空白視窗UI執行顯示1.基本配置PC

QTQT從零入門教程(六):QDockWidget停靠視窗

QDockWidget   上節我們引出了QDockWidget的概念,這節進行講解並加以引用。   常用函式:   1、addDockWidget:新增停靠控制元件,用於指定或更改停靠控制元件的位置以及方向。 void QMainWindow::ad

QTQT從零入門教程(十一):QT自定義視窗

  首先是借鑑了網上的部落格,實現無邊框,自由拖動的自定義視窗效果。 #ifndef CUSTOMWINDOW_H #define CUSTOMWINDOW_H #include <QtGui> #include <QtWidg

QtQt自定義介面(實現無邊框、可移動)

簡述 UI設計是指對軟體的人機互動、操作邏輯、介面美觀的整體設計。好的UI設計不僅是讓軟體變得有個性、有品位,還要讓軟體的操作變得舒適簡單、自由,充分體現軟體的定位和特點。 愛美之心人皆有之。其實軟體介面就像工業造型一樣,是產品的重要賣點。一個產品擁有美觀的介面會給人帶來舒適的視覺享受,拉近人與產品的

QtQt自定義介面(窗體縮放-跨平臺終極版)

簡述 通過上一節內容,我們實現了窗體的縮放,功能很不錯,但是很遺憾-不支援跨平臺!如果對於多平臺來說,這是一個硬傷,所以,我們急需要一個能夠支援跨平臺的實現方案。 在網上看到過很多不同的實現方式,多多少少會存在一些問題-要麼融合度太高、要麼不能很好地進行移動、縮放。基於前人的分享與總結,最後,我花了很

QtQt自定義介面(右下角冒泡)

簡述 網頁右下角上經常會出現一些提示性的資訊,桌面軟體中也比較常見,類似360新聞、QQ訊息提示一樣! 這種功能用動畫實現起來很簡單,這節我們暫時使用定時器來實現,後面章節會對動畫框架進行詳細講解。 下面我們來實現一個右下角冒泡的功能。 簡述 效果 實現原理 實現 效果

QtQt程序間通訊(Windows訊息)

簡述 通過上一節的瞭解,我們可以看出程序通訊的方式很多,今天分享下如何利用Windows訊息機制來進行不同程序間的通訊。 效果 傳送訊息 自定義型別與接收窗體 包含所需庫,定義傳送的自定義型別、接收訊息的窗體標題。自定義型別可以處理訊息過多情況下,對訊息的區分,如果不需要也可以去掉。

QtQt重啟應用程式

簡介 今天分享的內容有些意思-如何重啟一個應用程式。其實,有時候這是一個很重要的功能點,而且很人性化、易用性很好。 例如:切換使用者。當某個使用者登入成功之後,需要切換到其它賬號,那麼這時,你就知道它的重要性了。 效果 qApp退出程式碼重啟 定義退出程式碼 比較好的方式,在主視窗中定

QtQt啟動外部程式

簡述 QProcess可以用來啟動外部程式,並與它們互動。 要啟動一個程序,通過呼叫start()來進行,引數包含程式的名稱和命令列引數,引數作為一個QStringList的單個字串。 另外,也可以使用setProgram()和setArguments()來執行,然後呼叫start()或open()

QtQt密碼框不可選中、複製、貼上、無右鍵選單等

簡述 在做使用者登入、修改密碼的時候,往往會用到密碼框,其中一些功能要求與普通的輸入框不同,例如:不能選中、複製、貼上、無右鍵選單等功能,當然設定密碼不可見是必須的! 下面介紹兩種方式來實現相同的效果。 簡述 效果 基礎部分 事件過濾器 介面說明 實現方式 事件重

QtQtTab鍵切換焦點順序

簡介 Qt的視窗部件按使用者的習慣來處理鍵盤焦點。也就是說,其出發點是使用者的焦點能定向到任何一個視窗,或者視窗中任何一個部件。 焦點獲取方式比較多,例如:滑鼠點選、Tab鍵切換、快捷鍵、滑鼠滾輪等。 習慣性的,我們經常會使用Tab鍵來控制焦點順序,比如:使用者註冊時,個人資訊輸入框焦點的切換、執行

QtQt自定義介面(QMessageBox)

簡述 通過前幾節的自定義窗體的學習,我們可以很容易的寫出一套屬於自己風格的介面框架,通用於各種窗體,比如:QWidget、QDialog、QMainWindow。 大多數窗體的實現都是採用控制元件堆積來完成的,只要思路清晰,再複雜的介面實現起來都遊刃有餘。下面我來列舉一個由QMessageBox擴充套

QtQt程序間通訊(共享記憶體)

簡述 上一節中,我們分享下如何利用Windows訊息機制來進行不同程序間的通訊。但是有很多侷限性,比如:不能跨平臺,而且必須兩個程序同時存在才可以,要麼程序A發了訊息誰接收呢? 下面我們來分享另外一種跨平臺的進行間通訊的方式-Shared Memory(共享記憶體)。 簡述 注意事項

QtQt自定義搜尋框

簡述 關於搜尋框,大家都經常接觸。例如:瀏覽器搜尋、Windows資源管理器搜尋等。 當然,這些對於Qt實現來說毫無壓力,只要思路清晰,分分鐘搞定。 簡述 效果 細節分析 原始碼下載 效果 細節分析 實現細節需要如下步驟: 組合實現,輸入框+

QtQt自定義介面(窗體縮放)

簡述 通過前兩節內容,我們實現了自定義窗體的移動,以及自定義標題欄-用來顯示窗體的圖示、標題,以及控制窗體最小化、最大化、關閉。 在這之後,我們還缺少窗體的縮放-當滑鼠移動到窗體的邊框-左、上、右、下、左上角、左下角、右上角、右下角時候,滑鼠變為相應的樣式,並且窗體可以隨著滑鼠拖動而進行放大、縮小。

QtQDialog遮蔽Esc鍵

簡述 Qt中Esc鍵會在一些控制元件中預設的進行一些事件的觸發,比如:QDialog,按下Esc鍵視窗消失。大多數情況下,我們不需要這麼做,那麼就需要對預設事件進行遮蔽。 簡述 原始碼分析 事件過濾器 事件重寫 原始碼分析 通過檢視QDialog的原始碼,我們很容易會發現

QtQt設定QWidget背景色

簡述 QWidget是所有使用者介面物件的基類,這意味著可以用同樣的方法為其它子類控制元件改變背景顏色。 Qt中視窗背景的設定,下面介紹三種方法。 使用QPalette 使用Style Sheet 繪圖事件 一般我不用QSS設定視窗背景,也不建議使用。(這裡是對於視窗而,如果是子部件當

QtQt程序間通訊(QProcess)

簡述 前幾節裡,分享了程序通訊的幾種方式:Windows訊息機制、Shared Memory(共享記憶體),本節講解下關於程序通訊的另外一種方式-QProcess。 簡述 命令列讀取 說明 實現 更多參考 命令列引數啟動 說明 程序A-帶參啟動

QtQt程序間通訊(IPC)

簡述 程序間通訊,就是在不同程序之間傳播或交換資訊。那麼不同程序之間存在著什麼雙方都可以訪問的介質呢?程序的使用者空間是互相獨立的,一般而言是不能互相訪問的,唯一的例外是共享記憶體區。但是,系統空間卻是“公共場所”,所以核心顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪問的外設了。在這個意義上,兩