内容简介:用来显示不可编辑的文字或图片,或GIF动画。也可用作其他控件的占位符。纯文本、超链接或富文本都可以显示在这个Label上。最常使用的输入框,可供输入一行文字。输入多行文字时需要使用QTextEdit。显示一个按钮,当点击时可以通过编程来调用一个确定的函数。
用来显示不可编辑的文字或图片,或GIF动画。也可用作其他控件的占位符。纯文本、超链接或富文本都可以显示在这个Label上。
QLabel类的函数
- setAlignment():对齐文本,参数有Qt.AlignLeft、Qt.AlignRight、Qt.AlignCenter、Qt.AlignJustify
- setIndent():设置文本缩进
- setPixmap():显示一张图片
- Text():显示label的标题
- setText(): 编写程序来设定标题
- selectedText():显示所选文本,其中textInteractionFlag必须设为TextSelectableByMouse
- setBuddy():将label与某个输入widget相关联
- setWordWrap(): Enables or disables wrapping text in the label
QLabel类的信号
- linkActivated:如果Label上面的超链接被点击了,那么就打开URL。setOpenExternalLinks必须被设为true。
- linkHovered:当鼠标悬停在Label上面的超链接时,与该信号相关联的Slot函数将被调用
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * def window(): app = QApplication(sys.argv) win = QWidget() l1 = QLabel() l2 = QLabel() l3 = QLabel() l4 = QLabel() l1.setText("Hello World") l4.setText("TutorialsPoint") l2.setText("welcome to Python GUI Programming") l1.setAlignment(Qt.AlignCenter) l3.setAlignment(Qt.AlignCenter) l4.setAlignment(Qt.AlignRight) l3.setPixmap(QPixmap("python.jpg")) vbox = QVBoxLayout() vbox.addWidget(l1) vbox.addStretch() vbox.addWidget(l2) vbox.addStretch() vbox.addWidget(l3) vbox.addStretch() vbox.addWidget(l4) l1.setOpenExternalLinks(True) l4.linkActivated.connect(clicked) l2.linkHovered.connect(hovered) l1.setTextInteractionFlags(Qt.TextSelectableByMouse) win.setLayout(vbox) win.setWindowTitle("QLabel Demo") win.show() sys.exit(app.exec_()) def hovered(): print "hovering" def clicked(): print "clicked" if __name__ == '__main__': window()
单行输入QLineEdit
最常使用的输入框,可供输入一行文字。输入多行文字时需要使用QTextEdit。
QLineEdit类的函数
- setAlignment():同上
- clear():清除内容
- setEchoMode():控制输入框中文本的样式,参数有QLineEdit.Normal、QLineEdit.NoEcho、QLineEdit.Password、QLineEdit.PasswordEchoOnEdit
- setMaxLength():设置输入的字符最大长度
- setReadOnly():使文本框不可编辑
- setText():同上
- text():取得文本
- setValidator():设置生效规则。参数有:QIntValidator(限制输入为整数)、QDoubleValidator(浮点数)、QRegexpValidator(正则表达式)
- setInputMask():通过结合符号来设定输入的规范
- setFont():设置字体,通过QFont()来设置
QLineEdit类的信号
- cursorPositionChanged():鼠标移动
- editingFinished():点击回车或者输入框失去焦点
- returnPressed():点击回车
- selectionChanged():所选文本变化
- textChanged():通过输入或者编程改变了输入框中的文本
- textEdited():文本被编辑
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * def window(): app = QApplication(sys.argv) win = QWidget() e1 = QLineEdit() e1.setValidator(QIntValidator()) # e1只接收整数 e1.setMaxLength(4) # 整数最多有四位 e1.setAlignment(Qt.AlignRight) e1.setFont(QFont("Arial",20)) e2 = QLineEdit() e2.setValidator(QDoubleValidator(0.99,99.99,2)) # 最多两位小数 flo = QFormLayout() flo.addRow("integer validator", e1) flo.addRow("Double validator",e2) e3 = QLineEdit() e3.setInputMask('+99_9999_999999') # 设定输入的格式 flo.addRow("Input Mask",e3) e4 = QLineEdit() e4.textChanged.connect(textchanged) # 发射textChanged信号,执行下面的textchanged槽函数 flo.addRow("Text changed",e4) e5 = QLineEdit() e5.setEchoMode(QLineEdit.Password) # 设定显示模式为密码模式 flo.addRow("Password",e5) e6 = QLineEdit("Hello Python") e6.setReadOnly(True) # e6只读 flo.addRow("Read Only",e6) e5.editingFinished.connect(enterPress) # e5发射editingFinished信号,执行下面的enterPress槽函数 win.setLayout(flo) win.setWindowTitle("PyQt") win.show() sys.exit(app.exec_()) def textchanged(text): print "contents of text box: "+text def enterPress(): print "edited" if __name__ == '__main__': window()
按钮QPushButton
显示一个按钮,当点击时可以通过编程来调用一个确定的函数。
QPushButton类的函数
- setCheckable():设为true时识别按钮是按压还是释放
- toggle():在可选状态之间切换
- setIcon():显示图标
- setEnabled():当设为false时,按钮失效,因此点击时不会发射信号
- isChecked():返回按钮的布尔状态
- setDefault():设置按钮成为默认值
- setText():编写程序设置按钮的标题
- text():取回标题
QPushButton类的信号
主要就是clicked信号。
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class Form(QDialog): def __init__(self, parent=None): super(Form, self).__init__(parent) layout = QVBoxLayout() self.b1 = QPushButton("Button1") self.b1.setCheckable(True) # 识别b1的状态 self.b1.toggle() # 在状态之间切换 self.b1.clicked.connect(lambda:self.whichbtn(self.b1)) # 发射clicked信号并连接下面的whichbtn槽函数 self.b1.clicked.connect(self.btnstate) # 发射clicked信号并连接下面的btnstate槽函数 layout.addWidget(self.b1) self.b2 = QPushButton() self.b2.setIcon(QIcon(QPixmap("python.gif"))) # b2设置图标 self.b2.clicked.connect(lambda:self.whichbtn(self.b2)) layout.addWidget(self.b2) self.setLayout(layout) self.b3 = QPushButton("Disabled") # b3不可按 self.b3.setEnabled(False) layout.addWidget(self.b3) self.b4 = QPushButton("&Default") # 名称中加上前缀&,这样就可以使用快捷键Alt+D来点击该按钮 self.b4.setDefault(True) self.b4.clicked.connect(lambda:self.whichbtn(self.b4)) layout.addWidget(self.b4) self.setWindowTitle("Button demo") def btnstate(self): if self.b1.isChecked(): print "button pressed" else: print "button released" def whichbtn(self,b): print "clicked button is "+b.text() def main(): app = QApplication(sys.argv) ex = Form() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
单选框QRadioButton
显示一个带有文字标签的可选按钮,可在表单中选择某一个选项,是单选按钮。该类派生自QAbstractButton。
单选按钮默认是排他的,即一次只能选择一个选项。可以把Radio Button放入QGroupBox或QButtonGroup中以创建更多可选的选项。
QRadioButton的函数
- setChecked():更改单选按钮的状态
- setText():设置与按钮相关联的标签
- text():取得按钮的标题
- isChecked():检查按钮是否被选择
QRadioButton的信号
默认信号是toggled(),也可以使用从QAbstractButton类中继承的其他信号。
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class Radiodemo(QWidget): def __init__(self, parent = None): super(Radiodemo, self).__init__(parent) layout = QHBoxLayout() self.b1 = QRadioButton("Button1") self.b1.setChecked(True) # b1默认是勾选的 self.b1.toggled.connect(lambda:self.btnstate(self.b1)) # 发射toggled信号,连接btnstate槽函数 layout.addWidget(self.b1) self.b2 = QRadioButton("Button2") self.b2.toggled.connect(lambda:self.btnstate(self.b2)) layout.addWidget(self.b2) self.setLayout(layout) self.setWindowTitle("RadioButton demo") def btnstate(self,b): if b.text() == "Button1": if b.isChecked() == True: print b.text()+" is selected" else: print b.text()+" is deselected" if b.text() == "Button2": if b.isChecked() == True: print b.text()+" is selected" else: print b.text()+" is deselected" def main(): app = QApplication(sys.argv) ex = Radiodemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
复选框QCheckBox
文字标签之前的矩形框,是多选按钮。
多选按钮默认是不排他的,如果想要手动排他,需要将这些复选框放入QButtonGroup中。
QCheckBox的函数
- setChecked():更改按钮状态
- setText():设置标签
- text():取回标题
- isChecked():查看是否被勾选
- setTriState():提供无状态变化
QCheckBox的信号
有toggled()信号。还有stateChanged()信号,每次复选框勾选或清除时,都会发射该信号。
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class checkdemo(QWidget): def __init__(self, parent = None): super(checkdemo, self).__init__(parent) layout = QHBoxLayout() self.b1 = QCheckBox("Button1") self.b1.setChecked(True) # b1默认勾选 self.b1.stateChanged.connect(lambda:self.btnstate(self.b1)) # 发射stateChanged信号 layout.addWidget(self.b1) self.b2 = QCheckBox("Button2") self.b2.toggled.connect(lambda:self.btnstate(self.b2)) layout.addWidget(self.b2) self.setLayout(layout) self.setWindowTitle("checkbox demo") def btnstate(self,b): if b.text() == "Button1": if b.isChecked() == True: print b.text()+" is selected" else: print b.text()+" is deselected" if b.text() == "Button2": if b.isChecked() == True: print b.text()+" is selected" else: print b.text()+" is deselected" def main(): app = QApplication(sys.argv) ex = checkdemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
手动排他的形式为:
self.bg = QButtonGroup() self.bg.addButton(self.b1,1) self.bg.addButton(self.b2,2) self.bg.buttonClicked[QAbstractButton].connect(self.btngroup) # 发射buttonClicked信号 def btngroup(self,btn): print btn.text()+" is selected"
下拉列表QComboBox
提供一个下拉列表供选择,这样就可以用很少的屏幕空间来显示当前选择项
QComboBox的函数
- addItem():向集合中添加字符串
- addItems():以list的形式添加多个项目
- Clear():清除所有项目
- count():计算项目总数
- currentText():取回当前所选项目的文本
- itemText():显示属于特定索引的文本
- currentIndex():当前所选项的索引
- setItemText():改变特定索引的文本
QComboBox的信号
- activated():用户选择了某项
- currentIndexChanged():当前索引被用户或程序改变
- highlighted():某项被高亮
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class combodemo(QWidget): def __init__(self, parent = None): super(combodemo, self).__init__(parent) layout = QHBoxLayout() self.cb = QComboBox() self.cb.addItem("C") # 添加一个项目 self.cb.addItem("C++") self.cb.addItems(["Java", "C#", "Python"]) # 添加多个项目 self.cb.currentIndexChanged.connect(self.selectionchange) # 发射currentIndexChanged信号,连接下面的selectionchange槽 layout.addWidget(self.cb) self.setLayout(layout) self.setWindowTitle("combo box demo") def selectionchange(self,i): print "Items in the list are :" for count in range(self.cb.count()): print self.cb.itemText(count) print "Current index",i,"selection changed ",self.cb.currentText() def main(): app = QApplication(sys.argv) ex = combodemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
调值框QSpinBox
一个显示整数的文本框,右侧可以有上下按钮调节。
默认情况下,整数值从0开始,最大是99,步长为1。如果想用浮点数,需要使用QDoubleSpinBox。
QSpinBox的函数
- setMinimum():设定最小值
- setMaximum():设定最大值
- setRange():设定最小值、最大值和步长
- setValue():编写程序来设定数值
- Value():返回当前值
- singleStep():设定步长
QSpinBox的信号
每次点击up/down按钮时,就会发射valueChanged()信号,相应的槽可以通过value()函数获取当前值。
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class spindemo(QWidget): def __init__(self, parent = None): super(spindemo, self).__init__(parent) layout = QVBoxLayout() self.l1 = QLabel("current value:") self.l1.setAlignment(Qt.AlignCenter) layout.addWidget(self.l1) self.sp = QSpinBox() layout.addWidget(self.sp) self.sp.valueChanged.connect(self.valuechange) # 发射valueChanged信号,与下面的valuechange槽连接 self.setLayout(layout) self.setWindowTitle("SpinBox demo") def valuechange(self): self.l1.setText("current value:"+str(self.sp.value())) # 用QLabel显示 def main(): app = QApplication(sys.argv) ex = spindemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
滑块QSlider
提供一个沟槽,上面有一个滑块可以运动,可以用来控制一个有界值,滑块的位置代表了值的大小。
可以水平或垂直放置:
self.sp = QSlider(Qt.Horizontal) self.sp = QSlider(Qt.Vertical)
QSlider的函数
- setMinimum():设置最小值
- setMaximum():最大值
- setSingleStep():步长
- setValue():通过编写程序控制数值
- value():取回当前值
- setTickInterval():在沟槽上放置刻度的数目
- setTickPosition():在沟槽上放置刻度,参数可以是QSlider.NoTicks(没有刻度)、QSlider.TicksBothSides(两边都有刻度线)、QSlider.TicksAbove(在上侧有刻度线)、QSlider.TicksBelow(下侧显示)、QSlider.TicksLeft(左侧)、QSlider.TicksRight(右侧)
QSlider的信号
- valueChanged():滑块的值改变
- sliderPressed():用户开始按下滑块
- sliderMoved():用户拖动了滑块
- sliderReleased():用户释放了滑块
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class sliderdemo(QWidget): def __init__(self, parent = None): super(sliderdemo, self).__init__(parent) layout = QVBoxLayout() self.l1 = QLabel("Hello") self.l1.setAlignment(Qt.AlignCenter) layout.addWidget(self.l1) self.sl = QSlider(Qt.Horizontal) self.sl.setMinimum(10) self.sl.setMaximum(30) self.sl.setValue(20) self.sl.setTickPosition(QSlider.TicksBelow) self.sl.setTickInterval(5) layout.addWidget(self.sl) self.sl.valueChanged.connect(self.valuechange) self.setLayout(layout) self.setWindowTitle("SpinBox demo") def valuechange(self): size = self.sl.value() self.l1.setFont(QFont("Arial",size)) def main(): app = QApplication(sys.argv) ex = sliderdemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
菜单栏QMenuBar和QMenu
菜单栏是在主窗口QMainWindow的标题栏下面的长条,用来显示QMenu类的对象。QMenu类可以向菜单栏加入widgets,也用来创建上下文菜单和弹出菜单。每个QMenu对象可能包含一个或多个QAction或级联QMenu对象。
QMenu的函数
- menuBar():返回主窗口的QMenubar对象
- addMenu():在菜单栏上添加一个新的QMenu对象
- addAction():对该QMenu对象添加一个新的动作,可包含文字或图标
- setEnabled():设置action的状态为enabled或disabled
- addSeperator():在菜单中添加分割线
- Clear():清楚菜单栏/菜单中的所有内容
- setShortcut():为action添加快捷键
- setText():为action添加文本
- setTitle():设定QMenu的标题
- text():取回与QAction对象相关联的文本
- title():取回与QMenu对象相关联的文本
QMenu的信号
当任一QAction按钮被点击时,QMenu都会发射triggered()信号。
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class menudemo(QMainWindow): def __init__(self, parent = None): super(menudemo, self).__init__(parent) layout = QHBoxLayout() bar = self.menuBar() # 创建菜单栏bar file = bar.addMenu("File") # 在菜单栏上添加菜单file file.addAction("New") # 在菜单上添加动作New save = QAction("Save",self) save.setShortcut("Ctrl+S") # 为动作save创建快捷键 file.addAction(save) # 在菜单file上添加动作save edit = file.addMenu("Edit") # 在菜单file上再添加一个级联菜单edit edit.addAction("copy") edit.addAction("paste") quit = QAction("Quit",self) file.addAction(quit) file.triggered[QAction].connect(self.processtrigger) # 发射triggered信号,与processtrigger槽相连接 self.setLayout(layout) self.setWindowTitle("menu demo") def processtrigger(self,q): print q.text()+" is triggered" def main(): app = QApplication(sys.argv) ex = menudemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
工具栏QToolBar
工具栏是一个可以移动的面板,包含文本按钮或者图标按钮或其他小控件。通常把它放在标题栏下面,也可以拖动它让它悬浮。
QToolBar的函数
- addAction():添加文本或图标样式的 工具 按钮
- addSeperator():添加分割线
- addWidget():添加其他控件而不是按钮
- addToolBar():QMainWindow主窗口新增一个工具栏
- setMovable():设置工具栏可移动
- setOrientation():设成水平或垂直,参数为Qt.Horizontal或Qt.Vertical
QToolBar的信号
当点击工具栏中的按钮时,发射ActionTriggered()信号。
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class tooldemo(QMainWindow): def __init__(self, parent = None): super(tooldemo, self).__init__(parent) layout = QVBoxLayout() tb = self.addToolBar("File") new = QAction(QIcon("new.bmp"),"new",self) tb.addAction(new) open = QAction(QIcon("open.bmp"),"open",self) tb.addAction(open) save = QAction(QIcon("save.bmp"),"save",self) tb.addAction(save) tb.actionTriggered[QAction].connect(self.toolbtnpressed) self.setLayout(layout) self.setWindowTitle("toolbar demo") def toolbtnpressed(self,a): print "pressed tool button is",a.text() def main(): app = QApplication(sys.argv) ex = tooldemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
输入对话框QInputDialog
输入对话框是一个预配置的对话框,有一个文本框和两个按钮OK和Cancel。当用户点击OK或者回车时,父窗口就把输入收集到文本框中。
用户的输入可以是一个数字、字符串或者从列表中选择的项目。
QInputDialog的函数
- getInt():创建一个用于整数的spin box
- getDouble():创建一个用于浮点数的spin box
- getText():一个简单的行编辑区域用于输入文本
- getItem():可以从中选择某项的combo box
QInputDialog的函数
该对话框实际上是其他widget的整合,所以没有自己的信号
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class inputdialogdemo(QWidget): def __init__(self, parent = None): super(inputdialogdemo, self).__init__(parent) layout = QFormLayout() self.btn = QPushButton("Choose from list") self.btn.clicked.connect(self.getItem) self.le = QLineEdit() layout.addRow(self.btn,self.le) self.btn1 = QPushButton("get name") self.btn1.clicked.connect(self.gettext) self.le1 = QLineEdit() layout.addRow(self.btn1,self.le1) self.btn2 = QPushButton("Enter an integer") self.btn2.clicked.connect(self.getint) self.le2 = QLineEdit() layout.addRow(self.btn2,self.le2) self.setLayout(layout) self.setWindowTitle("Input Dialog demo") def getItem(self): items = ("C", "C++", "Java", "Python") item, ok = QInputDialog.getItem(self, "select input dialog", "list of languages", items, 0, False) if ok and item: self.le.setText(item) def gettext(self): text, ok = QInputDialog.getText(self, 'Text Input Dialog', 'Enter your name:') if ok: self.le1.setText(str(text)) def getint(self): num,ok = QInputDialog.getInt(self,"integer input dualog","enter a number") if ok: self.le2.setText(str(num)) def main(): app = QApplication(sys.argv) ex = inputdialogdemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
字体对话框QFontDialog
字体对话框的返回结果是一个QFont对象,可以用于父窗口的字体设置。
QFontDialog的函数
- getfont():显示字体选择对话框
- setCurrentFont():设置对话框的默认字体
QFontDialog的信号
也是没有自己的信号
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class fontdialogdemo(QWidget): def __init__(self, parent = None): super(fontdialogdemo, self).__init__(parent) layout = QVBoxLayout() self.btn = QPushButton("choose font") self.btn.clicked.connect(self.getfont) layout.addWidget(self.btn) self.le = QLabel("Hello") layout.addWidget(self.le) self.setLayout(layout) self.setWindowTitle("Font Dialog demo") def getfont(self): font, ok = QFontDialog.getFont() if ok: self.le.setFont(font) def main(): app = QApplication(sys.argv) ex = fontdialogdemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
文件对话框QFileDialog
该对话框用于文件选择。
QFileDialog的函数
- getOpenFileName():返回用户所选文件的名字来打开它
- getSaveFileName():使用用户所选文件的名字来存储文件
- setacceptMode():决定是打开还是保存,参数是QFileDialog.AcceptOpen和QFileDialog.AcceptSave
- setFileMode():所选文件的类型,枚举常量有QFileDialog.AnyFile、QFileDialog.ExistingFile、QFileDialog.Directory和QFileDialog.Existingfiles
- setFilter():仅显示有特定扩展名的文件
QFileDialog的信号
同上,没有自己的信号
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class filedialogdemo(QWidget): def __init__(self, parent = None): super(filedialogdemo, self).__init__(parent) layout = QVBoxLayout() self.btn = QPushButton("QFileDialog static method demo") self.btn.clicked.connect(self.getfile) layout.addWidget(self.btn) self.le = QLabel("Hello") layout.addWidget(self.le) self.btn1 = QPushButton("QFileDialog object") self.btn1.clicked.connect(self.getfiles) layout.addWidget(self.btn1) self.contents = QTextEdit() layout.addWidget(self.contents) self.setLayout(layout) self.setWindowTitle("File Dialog demo") def getfile(self): fname = QFileDialog.getOpenFileName(self, 'Open file', 'c:\\',"Image files (*.jpg *.gif)") self.le.setPixmap(QPixmap(fname)) def getfiles(self): dlg = QFileDialog() dlg.setFileMode(QFileDialog.AnyFile) dlg.setFilter("Text files (*.txt)") filenames = QStringList() if dlg.exec_(): filenames = dlg.selectedFiles() f = open(filenames[0], 'r') with f: data = f.read() self.contents.setText(data) def main(): app = QApplication(sys.argv) ex = filedialogdemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
标签QTabWidget
当需要同时显示很多项目时,可以用标签来归类管理。
QTabWidget的函数
- addTab():添加一个标签以及与之相关联的页面
- insertTab():在想要的位置插入一个标签及页面
- removeTab():删除给定索引的标签
- setCurrentIndex():设置当前可见的页面的索引作为当前操作
- setCurrentWidget():使可见页面作为当前
- setTabBar():设置标签栏
- setTabPosition():设置标签位置,参数有QTabWidget.North(页面上方)、QTabWidget.South(页面下方)、QTabWidget.West(页面左侧)、QTabWidget.East(页面右侧)
- setTabText():定义该tab的文本
QTabWidget的信号
- currentChanged():当前页面索引变化
- tabClosedRequested():点击了标签上的关闭按钮
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class tabdemo(QTabWidget): def __init__(self, parent = None): super(tabdemo, self).__init__(parent) self.tab1 = QWidget() self.tab2 = QWidget() self.tab3 = QWidget() self.addTab(self.tab1,"Tab 1") self.addTab(self.tab2,"Tab 2") self.addTab(self.tab3,"Tab 3") self.tab1UI() self.tab2UI() self.tab3UI() self.setWindowTitle("tab demo") def tab1UI(self): layout = QFormLayout() layout.addRow("Name",QLineEdit()) layout.addRow("Address",QLineEdit()) self.setTabText(0,"Contact Details") self.tab1.setLayout(layout) def tab2UI(self): layout = QFormLayout() sex = QHBoxLayout() sex.addWidget(QRadioButton("Male")) sex.addWidget(QRadioButton("Female")) layout.addRow(QLabel("Sex"),sex) layout.addRow("Date of Birth",QLineEdit()) self.setTabText(1,"Personal Details") self.tab2.setLayout(layout) def tab3UI(self): layout = QHBoxLayout() layout.addWidget(QLabel("subjects")) layout.addWidget(QCheckBox("Physics")) layout.addWidget(QCheckBox("Maths")) self.setTabText(2,"Education Details") self.tab3.setLayout(layout) def main(): app = QApplication(sys.argv) ex = tabdemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
堆栈QStackedWidget
QStackedWidget跟QTabWidget类似,也能有效利用空间
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class stackedExample(QWidget): def __init__(self): super(stackedExample, self).__init__() self.leftlist = QListWidget () self.leftlist.insertItem (0, 'Contact' ) self.leftlist.insertItem (1, 'Personal' ) self.leftlist.insertItem (2, 'Educational' ) self.stack1 = QWidget() self.stack2 = QWidget() self.stack3 = QWidget() self.stack1UI() self.stack2UI() self.stack3UI() self.Stack = QStackedWidget (self) self.Stack.addWidget (self.stack1) self.Stack.addWidget (self.stack2) self.Stack.addWidget (self.stack3) hbox = QHBoxLayout(self) hbox.addWidget(self.leftlist) hbox.addWidget(self.Stack) self.setLayout(hbox) self.leftlist.currentRowChanged.connect(self.display) self.setGeometry(300, 50, 10,10) self.setWindowTitle('StackedWidget demo') self.show() def stack1UI(self): layout = QFormLayout() layout.addRow("Name",QLineEdit()) layout.addRow("Address",QLineEdit()) #self.setTabText(0,"Contact Details") self.stack1.setLayout(layout) def stack2UI(self): layout = QFormLayout() sex = QHBoxLayout() sex.addWidget(QRadioButton("Male")) sex.addWidget(QRadioButton("Female")) layout.addRow(QLabel("Sex"),sex) layout.addRow("Date of Birth",QLineEdit()) self.stack2.setLayout(layout) def stack3UI(self): layout = QHBoxLayout() layout.addWidget(QLabel("subjects")) layout.addWidget(QCheckBox("Physics")) layout.addWidget(QCheckBox("Maths")) self.stack3.setLayout(layout) def display(self,i): self.Stack.setCurrentIndex(i) def main(): app = QApplication(sys.argv) ex = stackedExample() sys.exit(app.exec_()) if __name__ == '__main__': main()
分割条QSplitter
分割条能够通过拖动子控件之间的边界,使得它们的尺寸动态变化。
QSplitter的函数
- addWidget():对splitter的布局上添加控件
- indexOf():返回控件的索引
- insertWidget():在指定索引上插入控件
- setOrientation():设置布局水平还是垂直,参数有Qt.Horizontal和Qt.Vertical
- setSizes():设置每个控件的初始尺寸
- count():返回控件的总数
QSplitter的信号
当分割条被拖动时,发射splitterMoved()信号。
举例
import sys from PyQt4.QtGui import * from PyQt4.QtCore import * class Example(QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): hbox = QHBoxLayout(self) topleft = QFrame() topleft.setFrameShape(QFrame.StyledPanel) bottom = QFrame() bottom.setFrameShape(QFrame.StyledPanel) splitter1 = QSplitter(Qt.Horizontal) textedit = QTextEdit() splitter1.addWidget(topleft) splitter1.addWidget(textedit) splitter1.setSizes([100,200]) splitter2 = QSplitter(Qt.Vertical) splitter2.addWidget(splitter1) splitter2.addWidget(bottom) hbox.addWidget(splitter2) self.setLayout(hbox) QApplication.setStyle(QStyleFactory.create('Cleanlooks')) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('QSplitter demo') self.show() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
可停靠窗口QDock
可停靠窗口是主窗口的一个子窗口,可以悬浮,也可以附着在主窗口的特定位置。
QDock的函数
- setWidget():在可停靠窗口上设置任意Widget
- setFloating():如果设为true,那么dock window可悬浮
- setAllowedAreas():设置该子窗口可停靠的位置,参数有LeftDockWidgetArea、RightDockWidgetArea、TopDockWidgetArea、BottomDockWidgetArea、NoDockWidgetArea
- setFeatures():设置子窗口的特性,参数有DockWidgetClosable、DockWidgetMovable、DockWidgetFloatable、DockWidgetVerticalTitleBar、NoDockWidgetFeatures
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class dockdemo(QMainWindow): def __init__(self, parent = None): super(dockdemo, self).__init__(parent) layout = QHBoxLayout() bar = self.menuBar() file = bar.addMenu("File") file.addAction("New") file.addAction("save") file.addAction("quit") self.items = QDockWidget("Dockable", self) self.listWidget = QListWidget() self.listWidget.addItem("item1") self.listWidget.addItem("item2") self.listWidget.addItem("item3") self.items.setWidget(self.listWidget) self.items.setFloating(False) self.setCentralWidget(QTextEdit()) self.addDockWidget(Qt.RightDockWidgetArea, self.items) self.setLayout(layout) self.setWindowTitle("Dock demo") def main(): app = QApplication(sys.argv) ex = dockdemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
状态栏QStatusBar
状态栏是主窗口下方的水平条,用来显示一个永久信息或者上下文有关的信息。
有三种类型的状态指示子:
- Temporary:占据大部分的状态栏。例如用来显示工具信息或者菜单信息
- Normal:占据一部分的状态栏,可能会被temporary的信息覆盖掉,比如文字处理器中显示页数和行号
- Permanent:从不隐藏。用于重要消息提示。
用QStatusBar()函数调用主窗口的状态栏,再用setStatusBar()激活它:
self.statusBar = QStatusBar() self.setStatusBar(self.statusBar)
QStatusBar的函数
- addWidget():在状态栏上添加控件
- addPermanentWidget():添加永久控件
- showMessage():在特定时间间隔内显示临时信息
- clearMessage():清除任意临时信息
- removeWidget():删除特定的控件
举例
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class statusdemo(QMainWindow): def __init__(self, parent = None): super(statusdemo, self).__init__(parent) bar = self.menuBar() file = bar.addMenu("File") file.addAction("show") file.addAction("add") file.addAction("remove") file.triggered[QAction].connect(self.processtrigger) self.setCentralWidget(QTextEdit()) self.statusBar = QStatusBar() self.b = QPushButton("click here") self.setWindowTitle("QStatusBar Example") self.setStatusBar(self.statusBar) def processtrigger(self,q): if (q.text() == "show"): self.statusBar.showMessage(q.text()+" is clicked",2000) if q.text() == "add": self.statusBar.addWidget(self.b) if q.text() == "remove": self.statusBar.removeWidget(self.b) self.statusBar.show() def main(): app = QApplication(sys.argv) ex = statusdemo() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
列表QListWidget
QListWidget是一个基于item的界面来从一个list中添加或删除item。每个item都是一个QListWidgetItem对象。
QListWidget的函数
- addItem():在列表中增加QListWidgetItem对象或字符串
- addItems():添加list中的每一项
- insertItem():在特定索引位置插入某项
- clear():清除内容
- setCurrentItem():通过编写程序来设定当前选择的项目
- sortItems():按升序重新排列项目
QListWidget的信号
- currentItemChanged():当前项目改变
- itemClicked():当前项目被点击
举例
from PyQt4.QtGui import * from PyQt4.QtCore import * import sys class myListWidget(QListWidget): def Clicked(self,item): QMessageBox.information(self, "ListWidget", "You clicked: "+item.text()) def main(): app = QApplication(sys.argv) listWidget = myListWidget() #Resize width and height listWidget.resize(300,120) listWidget.addItem("Item 1"); listWidget.addItem("Item 2"); listWidget.addItem("Item 3"); listWidget.addItem("Item 4"); listWidget.setWindowTitle('PyQT QListwidget Demo') listWidget.itemClicked.connect(listWidget.Clicked) listWidget.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
滚动条QScrollBar
一个滚动条有4个区域:两个箭头、滑块、页面控制区。
QScrollBar的信号
- valueChanged():滚动条的值改变
- sliderMoved():用户拖动滑块
举例
import sys from PyQt4.QtGui import * from PyQt4.QtCore import * class Example(QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): vbox = QVBoxLayout(self) hbox = QHBoxLayout() self.l1 = QLabel("Drag scrollbar sliders to change color") self.l1.setFont(QFont("Arial",16)) hbox.addWidget(self.l1) self.s1 = QScrollBar() self.s1.setMaximum(255) self.s1.sliderMoved.connect(self.sliderval) self.s2 = QScrollBar() self.s2.setMaximum(255) self.s2.sliderMoved.connect(self.sliderval) self.s3 = QScrollBar() self.s3.setMaximum(255) self.s3.sliderMoved.connect(self.sliderval) hbox.addWidget(self.s1) hbox.addWidget(self.s2) hbox.addWidget(self.s3) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('QSplitter demo') self.show() def sliderval(self): print self.s1.value(),self.s2.value(), self.s3.value() palette = QPalette() c = QColor(self.s1.value(),self.s2.value(), self.s3.value(),255) palette.setColor(QPalette.Foreground,c) self.l1.setPalette(palette) def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
日历QCalendarWidget
可以用此控件方便地选择日期。
QCalendarWidget的函数
- setDateRange():设置可选日期的上界和下界
- setFirstDayOfWeek():设定第一列是星期几,参数有:Qt.Monday、Qt.Tuesday、…、Qt.Sunday
- setMinimumDate():设置日期下界
- setMaximumDate():设置日期上界
- setSelectedDate():设定一个QDate对象作为所选日期
- showToday():显示今天
- selectedDate():取得所选日期
- setGridvisible():设置日历网格的可见性
举例
import sys from PyQt4 import QtGui, QtCore class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): cal = QtGui.QCalendarWidget(self) cal.setGridVisible(True) cal.move(20, 20) cal.clicked[QtCore.QDate].connect(self.showDate) self.lbl = QtGui.QLabel(self) date = cal.selectedDate() self.lbl.setText(date.toString()) self.lbl.move(20, 200) self.setGeometry(100,100,300,300) self.setWindowTitle('Calendar') self.show() def showDate(self, date): self.lbl.setText(date.toString()) def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- [译]自定义控件教程: 可复用的 Slider
- WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
- WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
- Flutter控件--Scaffold
- Flutter控件--AppBar
- Flutter 手势密码控件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。