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

          導(dǎo)航

          留言簿(2)

          隨筆分類

          隨筆檔案

          Python

          搜索

          •  

          積分與排名

          • 積分 - 25728
          • 排名 - 1515

          最新評(píng)論

          閱讀排行榜

           
          PyQt4中的布局管理

          布局是GUI程序開發(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, 而其他的空間, 通過添加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

          需要說明一下, 部件也可以多行和多列. 下面的列子就演示了之一點(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 閱讀(6660) 評(píng)論(10)  編輯  收藏 所屬分類: Python
          評(píng)論:

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


          網(wǎng)站導(dǎo)航:
           
           
          Copyright © glorywine Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 陆川县| 吉林市| 肇庆市| 高碑店市| 嵊泗县| 旬邑县| 杭锦旗| 湟中县| 韶关市| 平乐县| 绥德县| 龙南县| 肥西县| 高密市| 嘉兴市| 平原县| 商南县| 班戈县| 东方市| 南通市| 军事| 吐鲁番市| 邛崃市| 武穴市| 潜山县| 遂平县| 榆树市| 台江县| 永泰县| 绵阳市| 无极县| 万宁市| 高雄市| 牙克石市| 陕西省| 云和县| 南阳市| 自治县| 黎城县| 通辽市| 长春市|