zoukankan      html  css  js  c++  java
  • PyQt中弹出对话框操作

    经常有初学者搞不清楚如何在PyQt中弹出对话框,以及如何处理返回值。这篇文章会举例说明,界面采用手工编写。

    我们一般说的对话框指的是模态对话框(Modal Dialogue Box),一旦弹出,就不能对话框以外的窗口进行操作,必须先关闭对话框。

    在PyQt中我们一般从QDialog继承创建一个类来操作,根据exec_()方法的返回值判断用户是【确定】还是【取消】了,当然也可以其他返回值,具体看文档。

    这个例子创建一个主窗口,有一个表格,记录用户姓名和年龄,一个【添加】按钮,点击弹出对话框,用户输入姓名和年龄,点击【确定】返回,在主窗体表格中插入一行数据。

    创建主窗体

    为了方便起见使用QWdiget创建主窗体,当然你可以使用QMainWindow,用QTableView和QStandardItemModel来创建表格。

    class MainWindow(QtGui.QWidget):
    def __init__(self, parent=None):
    QtGui.QMainWindow.__init__(self, parent)

    # 创建table和model
    table = QtGui.QTableView(parent=self)
    self.model = QtGui.QStandardItemModel(parent=self)
    self.model.setHorizontalHeaderLabels((u'姓名', u'年龄'))
    table.setModel(self.model)

    # 创建添加按钮
    button = QtGui.QPushButton(u'添加', parent=self)

    # 添加信号槽
    button.clicked.connect(self.add)

    # 创建一个垂直布局,用于防止表格和按钮
    layout = QtGui.QVBoxLayout()
    layout.addWidget(table)
    layout.addWidget(button)

    self.setLayout(layout)

    def add(self):
    pass
    创建对话框

    对话框从QDialog继承,按钮这里使用QButtonBox来创建,用QButtonBox的好处是创建方便,定义参数即可,并且会自动根据不同平台显示按钮的位置,和各平台风格保持一致,当然默认是英文的,你可以通过国际化来做成中文的。

    这里没有做对话框内容的验证,你可以覆盖QDialog的accept方法来进行验证。

    下面是对话框的创建代码,为了方便获取姓名和年龄变量,我写了两个方法供外部调用。

    class Dialog(QtGui.QDialog):
    def __init__(self, parent=None):
    QtGui.QDialog.__init__(self, parent)
    self.resize(240, 200)

    # 表格布局,用来布局QLabel和QLineEdit及QSpinBox
    grid = QtGui.QGridLayout()

    grid.addWidget(QtGui.QLabel(u'姓名', parent=self), 0, 0, 1, 1)

    self.leName = QtGui.QLineEdit(parent=self)
    grid.addWidget(self.leName, 0, 1, 1, 1)

    grid.addWidget(QtGui.QLabel(u'年龄', parent=self), 1, 0, 1, 1)

    self.sbAge = QtGui.QSpinBox(parent=self)
    grid.addWidget(self.sbAge, 1, 1, 1, 1)

    # 创建ButtonBox,用户确定和取消
    buttonBox = QtGui.QDialogButtonBox(parent=self)
    buttonBox.setOrientation(QtCore.Qt.Horizontal) # 设置为水平方向
    buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) # 确定和取消两个按钮
    # 连接信号和槽
    buttonBox.accepted.connect(self.accept) # 确定
    buttonBox.rejected.connect(self.reject) # 取消

    # 垂直布局,布局表格及按钮
    layout = QtGui.QVBoxLayout()

    # 加入前面创建的表格布局
    layout.addLayout(grid)

    # 放一个间隔对象美化布局
    spacerItem = QtGui.QSpacerItem(20, 48, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
    layout.addItem(spacerItem)

    # ButtonBox
    layout.addWidget(buttonBox)

    self.setLayout(layout)

    def name(self):
    return self.leName.text()

    def age(self):
    return self.sbAge.value()
    编写对话框调用代码

    调用对话框只要使用exec_方法即可,它会弹出对话框并根据用户操作返回值,根据返回值判断是【确定】还是【取消】。

    dialog = Dialog(parent=self)
    if dialog.exec_():
    self.model.appendRow((
    QtGui.QStandardItem(dialog.name()),
    QtGui.QStandardItem(str(dialog.age())),
    ))

    dialog.destroy()
    完整代码和截图

    # -*- coding: utf-8 -*-
    from PyQt4 import QtGui, QtCore

    class MainWindow(QtGui.QWidget):
    def __init__(self, parent=None):
    QtGui.QMainWindow.__init__(self, parent)

    # 创建table和model
    table = QtGui.QTableView(parent=self)
    self.model = QtGui.QStandardItemModel(parent=self)
    self.model.setHorizontalHeaderLabels((u'姓名', u'年龄'))
    table.setModel(self.model)

    # 创建添加按钮
    button = QtGui.QPushButton(u'添加', parent=self)

    # 添加信号槽
    button.clicked.connect(self.add)

    # 创建一个垂直布局,用于防止表格和按钮
    layout = QtGui.QVBoxLayout()
    layout.addWidget(table)
    layout.addWidget(button)

    self.setLayout(layout)

    def add(self):
    dialog = Dialog(parent=self)
    if dialog.exec_():
    self.model.appendRow((
    QtGui.QStandardItem(dialog.name()),
    QtGui.QStandardItem(str(dialog.age())),
    ))

    dialog.destroy()


    class Dialog(QtGui.QDialog):
    def __init__(self, parent=None):
    QtGui.QDialog.__init__(self, parent)
    self.resize(240, 200)

    # 表格布局,用来布局QLabel和QLineEdit及QSpinBox
    grid = QtGui.QGridLayout()

    grid.addWidget(QtGui.QLabel(u'姓名', parent=self), 0, 0, 1, 1)

    self.leName = QtGui.QLineEdit(parent=self)
    grid.addWidget(self.leName, 0, 1, 1, 1)

    grid.addWidget(QtGui.QLabel(u'年龄', parent=self), 1, 0, 1, 1)

    self.sbAge = QtGui.QSpinBox(parent=self)
    grid.addWidget(self.sbAge, 1, 1, 1, 1)

    # 创建ButtonBox,用户确定和取消
    buttonBox = QtGui.QDialogButtonBox(parent=self)
    buttonBox.setOrientation(QtCore.Qt.Horizontal) # 设置为水平方向
    buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) # 确定和取消两个按钮
    # 连接信号和槽
    buttonBox.accepted.connect(self.accept) # 确定
    buttonBox.rejected.connect(self.reject) # 取消

    # 垂直布局,布局表格及按钮
    layout = QtGui.QVBoxLayout()

    # 加入前面创建的表格布局
    layout.addLayout(grid)

    # 放一个间隔对象美化布局
    spacerItem = QtGui.QSpacerItem(20, 48, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
    layout.addItem(spacerItem)

    # ButtonBox
    layout.addWidget(buttonBox)

    self.setLayout(layout)

    def name(self):
    return self.leName.text()

    def age(self):
    return self.sbAge.value()


    if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

  • 相关阅读:
    N的阶乘:高精度
    蓝桥杯历届试题 连号区间数:枚举(含样例解释)
    最大公共子串:DP
    IncDec序列:差分+贪心
    [ACM] hdu 1465 不容易系列之一(错排复习)
    写给现在,写给未来
    [ACM] hdu 2082 找单词 (母函数)
    [ACM] poj 1146 ID Codes(字符串的下一个排列)
    [ACM] hdu 2149 Public Sale (巴什博奕)
    [ACM] hdu 1846 Brave Game (巴什博奕)
  • 原文地址:https://www.cnblogs.com/jsben/p/4909900.html
Copyright © 2011-2022 走看看