雜家雜談  
          日歷
          統(tǒng)計(jì)
          • 隨筆 - 7
          • 文章 - 1
          • 評(píng)論 - 15
          • 引用 - 0

          導(dǎo)航

          留言簿(2)

          隨筆分類

          隨筆檔案

          Python

          搜索

          •  

          積分與排名

          • 積分 - 25732
          • 排名 - 1515

          最新評(píng)論

          閱讀排行榜

           
          PyQt4中的布局管理

          布局是GUI程序開(kāi)發(fā)中非常重要的一個(gè)環(huán)節(jié), 而布局管理就是要規(guī)劃如何在窗口中放置需要的部件. PyQt4中就有兩種方法來(lái)完成布局任務(wù),一個(gè)是絕對(duì)位置(absolute positioning), 另一個(gè)就是使用布局類(layout classes).

          絕對(duì)位置(absolute positioning)
          這種方法就需要程序員在程序中指定每個(gè)部件的坐標(biāo)位置和大小. 在這里有幾個(gè)注意事項(xiàng).
          • 指定了坐標(biāo)和大小的部件是不能夠隨著窗口大小的變化而變化的.
          • 程序在不同的操作系統(tǒng)平臺(tái)上也許會(huì)有所變化.
          • 改變字體可能會(huì)引起布局的混亂.
          • 如果需要改變當(dāng)前的布局, 就需要重新編碼, 這意味著非常大的工作量.
          ?1?#!/usr/bin/python
          ?2?
          ?3?#?absolute.py
          ?4?
          ?5?import?sys
          ?6?from?PyQt4?import?QtGui
          ?7?
          ?8?class?Absolute(QtGui.QWidget):
          ?9?????def?__init__(self,?parent=None):
          10?????????QtGui.QWidget.__init__(self,?parent)
          11?????????
          12?????????self.setWindowTitle('Communication')
          13?????????
          14?????????label?=?QtGui.QLabel('Could\'t',?self)
          15?????????label.move(15,?10)
          16?
          17?????????label?=?QtGui.QLabel('care',?self)
          18?????????label.move(35,?40)
          19?
          20?????????label?=?QtGui.QLabel('less',?self)
          21?????????label.move(55,?65)
          22?
          23?????????label?=?QtGui.QLabel('And',?self)
          24?????????label.move(115,?65)
          25?
          26?????????label?=?QtGui.QLabel('then',?self)
          27?????????label.move(135,?45)
          28?
          29?????????label?=?QtGui.QLabel('you',?self)
          30?????????label.move(115,?25)
          31?
          32?????????label?=?QtGui.QLabel('kissed',?self)
          33?????????label.move(145,?10)
          34?
          35?????????label?=?QtGui.QLabel('me',?self)
          36?????????label.move(215,?10)
          37?
          38?????????self.resize(250,?150)
          39?
          40?app?=?QtGui.QApplication(sys.argv)
          41?qb?=?Absolute()
          42?qb.show()
          43?sys.exit(app.exec_())

          在這里, 就是簡(jiǎn)單的調(diào)用move()方法來(lái)指定部件的放置坐標(biāo). 坐標(biāo)的頂點(diǎn)就在窗口的左上角, x由左向右不斷增大, y由上到下不斷增大.
          Communication.png
          Figure: absolute positioning

          Box Layout

          使用布局類進(jìn)行布局管理是一件非常輕松的事情.? 最基本的布局類就是QHboxLayout和VHBoxLayout. 他們將部件線性的水平或垂直排列.
          這里假設(shè)我們要將兩個(gè)按鈕放在窗口的右下方, 要實(shí)現(xiàn)這樣的布局, 使用一個(gè)QHBoxLayout和一個(gè)QVBoxLayout, 而其他的空間, 通過(guò)添加stretch factor來(lái)實(shí)現(xiàn).

          ?1?#!/usr/bin/python
          ?2?
          ?3?#?boxlayout.py
          ?4?
          ?5?import?sys
          ?6?from?PyQt4?import?QtGui
          ?7?
          ?8?class?BoxLayout?(QtGui.QWidget):
          ?9?????def?__init__(self,?parent=None):
          10?????????QtGui.QWidget.__init__(self,?parent)
          11?????????
          12?????????self.setWindowTitle('boxlayout')
          13?????????
          14?????????ok?=?QtGui.QPushButton('OK')
          15?????????cancel?=?QtGui.QPushButton('Cancel')
          16?
          17?????????hbox?=?QtGui.QHBoxLayout()
          18?????????hbox.addStretch(1)
          19?????????hbox.addWidget(ok)
          20?????????hbox.addWidget(cancel)
          21?
          22?????????vbox?=?QtGui.QVBoxLayout()
          23?????????vbox.addStretch(1)
          24?????????vbox.addLayout(hbox)
          25?
          26?????????self.setLayout(vbox)
          27?????????
          28?????????self.resize(300,?150)
          29?
          30?app?=?QtGui.QApplication(sys.argv)
          31?qb?=?BoxLayout()
          32?qb.show()
          33?sys.exit(app.exec_())

          ok? = ?QtGui.QPushButton( ' OK ' )
          cancel?
          = ?QtGui.QPushButton( ' Cancel ' )
          創(chuàng)建兩個(gè)按鈕

          hbox? = ?QtGui.QHBoxLayout()
          hbox.addStretch(
          1 )
          hbox.addWidget(ok)
          hbox.addWidget(cancel)
          創(chuàng)建一個(gè)水平的box layout. 然后添加stretch factor和兩個(gè)按鈕.
          vbox? = ?QtGui.QVBoxLayout()
          vbox.addStretch(
          1 )
          vbox.addLayout(hbox)
          創(chuàng)建最后的布局類, 將水平的布局類放入到垂直的布局類當(dāng)中.
          self.setLayout(vbox)
          最后, 將窗口的布局設(shè)定為垂直布局.
          boxlayout-1.png
          Figure: box layout

          QGridLayout

          最常用的布局類應(yīng)當(dāng)是QGridLayout, 他將窗口分成不同的行和列.
          ?1?#!/usr/bin/python
          ?2?
          ?3?#?gridlayout.py
          ?4?
          ?5?import?sys
          ?6?from?PyQt4?import?QtGui
          ?7?
          ?8?class?GridLayout(QtGui.QWidget):
          ?9?????def?__init__(self,?parent=None):
          10?????????QtGui.QWidget.__init__(self,?parent)
          11?
          12?????????self.setWindowTitle('grid?layout')
          13?
          14?????????names?=?['Cls',?'Bck',?'',?'Close',?'7',?'8',?'9',?'/',
          15??????????????????'4',?'5',?'6',?'*',?'1',?'2',?'3',?'-',
          16??????????????????'0',?'.',?'=',?'+']
          17?????????
          18?????????grid?=?QtGui.QGridLayout()
          19?????????
          20?????????j?=?0
          21?????????pos?=?[
          22?????????????(0,?0),?(0,?1),?(0,?2),?(0,?3),
          23?????????????(1,?0),?(1,?1),?(1,?2),?(1,?3),
          24?????????????(2,?0),?(2,?1),?(2,?2),?(2,?3),
          25?????????????(3,?0),?(3,?1),?(3,?2),?(3,?3),
          26?????????????(4,?0),?(4,?1),?(4,?2),?(4,?3)
          27?????????????]
          28?????????
          29?????????for?i?in?names:
          30?????????????button?=?QtGui.QPushButton(i)
          31?????????????if?j?==?2:
          32?????????????????grid.addWidget(QtGui.QLabel(''),?0,?2)
          33?????????????else:
          34?????????????????grid.addWidget(button,?pos[j][0],?pos[j][1])
          35?????????????j?=?j?+?1
          36?????????
          37?????????self.setLayout(grid)
          38?
          39?app?=?QtGui.QApplication(sys.argv)
          40?qb?=?GridLayout()
          41?qb.show()
          42?sys.exit(app.exec_())
          在這個(gè)例子中, 創(chuàng)建了很多按鈕, 用來(lái)填充相應(yīng)的grid.
          grid? = ?QtGui.QGridLayout()
          這一句就創(chuàng)建了grid layout.
          if ?j? == ? 2 :
          ????grid?
          = ?addWidget(QtGui.QLabel( '' ),?0,? 2 )
          else :
          ????grid?
          = ?addWidget(button,?pos[j][0],?pos[j][i])
          把部件放入grid, 調(diào)用addWidget()方法就行了, 參數(shù)就是要放入的部件以及相應(yīng)的行數(shù)和列數(shù).
          grid layout.png
          Figure: grid layout

          需要說(shuō)明一下, 部件也可以多行和多列. 下面的列子就演示了之一點(diǎn).
          ?1?#!/usr/bin/python
          ?2?
          ?3?#?gridlayout2.py
          ?4?
          ?5?import?sys
          ?6?from?PyQt4?import?QtGui
          ?7?
          ?8?class?GridLayout2(QtGui.QWidget):
          ?9?????def?__init__(self,?parent=None):
          10?????????QtGui.QWidget.__init__(self,?parent)
          11?
          12?????????self.setWindowTitle('grid?layout2')
          13?
          14?????????title?=?QtGui.QLabel('Title')
          15?????????author?=?QtGui.QLabel('Author')
          16?????????review?=?QtGui.QLabel('Review')
          17?????????
          18?????????titleEdit?=?QtGui.QLineEdit()
          19?????????authorEdit?=?QtGui.QLineEdit()
          20?????????reviewEdit?=?QtGui.QTextEdit()
          21?
          22?????????grid?=?QtGui.QGridLayout()
          23?????????grid.setSpacing(10)
          24?
          25?????????grid.addWidget(title,?1,?0)
          26?????????grid.addWidget(titleEdit,?1,?1)
          27?
          28?????????grid.addWidget(author,?2,?0)
          29?????????grid.addWidget(authorEdit,?2,?1)
          30?
          31?????????grid.addWidget(review,?3,?0)
          32?????????grid.addWidget(reviewEdit,?3,?1,?5,?1)
          33?
          34?????????self.setLayout(grid)
          35?????????self.resize(350,?300)
          36?
          37?app?=?QtGui.QApplication(sys.argv)
          38?qb?=?GridLayout2()
          39?qb.show()
          40?sys.exit(app.exec_())
          41?

          grid? = ?QtGui.QGridLayout()
          grid.setSpacing(
          10 )
          創(chuàng)建布局類, 并設(shè)定部件之間的距離為10個(gè)像素.
          grid.addWidget(reviewEdit,? 3 ,? 1 ,? 5 ,?, 1 )
          給布局中添加部件時(shí), 可以指定占據(jù)的行數(shù)和占據(jù)的列數(shù). 這個(gè)例子中, 我們讓reviewEdit占據(jù)了5行.
          grid layout2.png
          Figure: grid layout 2




          posted on 2008-07-30 15:39 glorywine 閱讀(6661) 評(píng)論(10)  編輯  收藏 所屬分類: Python
          評(píng)論:
          • # re: PyQt4 - (4) 布局管理  jruv Posted @ 2008-12-11 13:26
            看完了,寫的非常好, 如果是原創(chuàng)的話,希望作者能夠繼續(xù)寫下去  回復(fù)  更多評(píng)論   

          • # re: PyQt4 - (4) 布局管理  ruiqi Posted @ 2009-02-08 10:37
            謝謝~~~教會(huì)我很多~~  回復(fù)  更多評(píng)論   

          • # re: PyQt4 - (4) 布局管理  pyqt Posted @ 2009-03-20 15:25
            寫得非常好,我也希望作者能繼續(xù)下去  回復(fù)  更多評(píng)論   

          • # re: PyQt4 - (4) 布局管理  hello Posted @ 2009-06-19 07:51
            對(duì)入門非常的不錯(cuò),我看了你這個(gè)再看《Programming GUI with PyQt》,感覺(jué)明白了不少,剛開(kāi)始看這本書的時(shí)候一頭霧水,謝謝。  回復(fù)  更多評(píng)論   

          • # re: PyQt4 - (4) 布局管理  qxykzx Posted @ 2009-11-17 17:47
            謝謝樓主,這方面的資料真的很少。學(xué)習(xí)了這篇文章,學(xué)到了很多東西^_^  回復(fù)  更多評(píng)論   

          • # re: PyQt4 - (4) 布局管理  digwtx Posted @ 2010-03-15 14:47
            翻譯得不錯(cuò)  回復(fù)  更多評(píng)論   

          • # re: PyQt4 - (4) 布局管理[未登錄](méi)  江山 Posted @ 2010-12-15 16:37
            覺(jué)悟比我高!不錯(cuò)的東西!  回復(fù)  更多評(píng)論   

          • # re: PyQt4 - (4) 布局管理  holyw Posted @ 2014-07-02 22:31
            清晰易懂,謝謝分享  回復(fù)  更多評(píng)論   

          • # re: PyQt4 - (4) 布局管理  re Posted @ 2014-08-14 22:54
            確實(shí)很好,入門導(dǎo)師  回復(fù)  更多評(píng)論   

          • # re: PyQt4 - (4) 布局管理  賴?yán)钊A Posted @ 2015-12-02 20:03
            好是好 看完還是有些不懂 真新手 pos那部分看不懂
              回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
           
          Copyright © glorywine Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 桂阳县| 乾安县| 濮阳县| 宜兰市| 阿合奇县| 中山市| 壶关县| 阿拉善左旗| 馆陶县| 长春市| 武城县| 庆安县| 呼伦贝尔市| 莆田市| 安徽省| 松阳县| 巴彦淖尔市| 宝山区| 土默特左旗| 彩票| 宣汉县| 濮阳市| 林甸县| 从江县| 黄山市| 嘉荫县| 崇文区| 枞阳县| 平乐县| 阜康市| 开化县| 水富县| 杭州市| 河源市| 敖汉旗| 瑞金市| 定陶县| 梧州市| 灵宝市| 南部县| 若尔盖县|