雜家雜談 |
|
|||
日歷
統(tǒng)計(jì)
導(dǎo)航留言簿(2)隨筆分類隨筆檔案Python搜索積分與排名
最新評(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).
?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由上到下不斷增大. ![]() 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
'
)
創(chuàng)建兩個(gè)按鈕
cancel? = ?QtGui.QPushButton( ' Cancel ' )
hbox?
=
?QtGui.QHBoxLayout()
創(chuàng)建一個(gè)水平的box layout. 然后添加stretch factor和兩個(gè)按鈕.hbox.addStretch( 1 ) hbox.addWidget(ok) hbox.addWidget(cancel)
vbox?
=
?QtGui.QVBoxLayout()
創(chuàng)建最后的布局類, 將水平的布局類放入到垂直的布局類當(dāng)中.
vbox.addStretch( 1 ) vbox.addLayout(hbox)
self.setLayout(vbox)
最后, 將窗口的布局設(shè)定為垂直布局.
![]() Figure: box layout QGridLayout 最常用的布局類應(yīng)當(dāng)是QGridLayout, 他將窗口分成不同的行和列.
?1?#!/usr/bin/python
在這個(gè)例子中, 創(chuàng)建了很多按鈕, 用來(lái)填充相應(yīng)的grid.
?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_())
grid?
=
?QtGui.QGridLayout()
這一句就創(chuàng)建了grid layout.
if
?j?
==
?
2
:
把部件放入grid, 調(diào)用addWidget()方法就行了, 參數(shù)就是要放入的部件以及相應(yīng)的行數(shù)和列數(shù).
????grid? = ?addWidget(QtGui.QLabel( '' ),?0,? 2 ) else : ????grid? = ?addWidget(button,?pos[j][0],?pos[j][i]) ![]() 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()
創(chuàng)建布局類, 并設(shè)定部件之間的距離為10個(gè)像素.
grid.setSpacing( 10 )
grid.addWidget(reviewEdit,?
3
,?
1
,?
5
,?,
1
)
給布局中添加部件時(shí), 可以指定占據(jù)的行數(shù)和占據(jù)的列數(shù). 這個(gè)例子中, 我們讓reviewEdit占據(jù)了5行.
![]() Figure: grid layout 2
評(píng)論:
|
![]() |
|
Copyright © glorywine | Powered by: 博客園 模板提供:滬江博客 |