从Pyside的子窗口获取设置

时间:2017-02-07 18:00:34

标签: python pyside

我有几个问题。

  1. 当我按下'打印'时,如何从子窗口正确获取设置?按钮?

  2. 如何关闭“设置”窗口并仅在用户按下“确定”时保存/提交更改。 vs'取消'只关闭对话框并驳回更改。

  3. enter image description here

    设置窗口

    import sys
    from PySide import QtGui, QtCore
    
    
    class SettingsWindow(QtGui.QDialog):
        def __init__(self, parent=None):
            super(SettingsWindow, self).__init__(parent)
            self.resize(200, 150)
            self.setWindowTitle('Settings')
            self.initUI()
    
        def initUI(self):
    
            lb_max = QtGui.QLabel('Max')
            self.ui_max = QtGui.QSpinBox()
            self.ui_max.setValue(5)
    
            lb_min = QtGui.QLabel('Min')
            self.ui_min = QtGui.QSpinBox()
            self.ui_min.setValue(10)
    
            lb_count = QtGui.QLabel('Count')
            self.ui_count = QtGui.QSpinBox()
            self.ui_count.setValue(25)
    
            self.buttons = QtGui.QDialogButtonBox();
            self.buttons.setOrientation(QtCore.Qt.Horizontal)
            self.buttons.setStandardButtons(QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.Cancel)
            self.buttons.layout().setDirection(QtGui.QBoxLayout.LeftToRight)
    
            grid = QtGui.QGridLayout()
            grid.setContentsMargins(10,10,10,10)
            grid.addWidget(lb_max,0,0)
            grid.addWidget(self.ui_max,0,1)
            grid.addWidget(lb_min,1,0)
            grid.addWidget(self.ui_min,1,1)
            grid.addWidget(lb_count,2,0)
            grid.addWidget(self.ui_count,2,1)
            grid.addWidget(self.buttons,3,1)
    
            self.setLayout(grid)
    

    主窗口

    class MainWindow(QtGui.QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            self.resize(200, 150)
            self.setWindowTitle('Assets')
            self.initUI()
    
        def initUI(self):
    
            self.mi_settings = QtGui.QAction('Settings', self)
            self.mi_settings.triggered.connect(self.open_settings)
    
            self.ui_button = QtGui.QPushButton('Print')
            self.ui_button.clicked.connect(self.clicked_button)
    
            menubar = self.menuBar()
            fileMenu = menubar.addMenu('&File')
            fileMenu.addAction(self.mi_settings)
    
            grid = QtGui.QVBoxLayout()
            grid.setContentsMargins(10,10,10,10)
            grid.addWidget(self.ui_button)
    
            main_widget = QtGui.QWidget()
            main_widget.setLayout(grid)
            self.setCentralWidget(main_widget)
    
        def open_settings(self):
            win = SettingsWindow()
            win.exec_()
    
        def clicked_button(self):
            print 'Settings'
            print '\tMax: '
            print '\tMin: '
            print '\tCount: '
    
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        ex = MainWindow()
        # ex = SettingsWindow()
        ex.show()
        sys.exit(app.exec_())
    

2 个答案:

答案 0 :(得分:1)

首先,您需要连接对话框中的按钮,以便您可以判断用户是否取消了该按钮:

class SettingsWindow(QtGui.QDialog):
    ...
    def initUI(self):
        ...
        self.buttons = QtGui.QDialogButtonBox()
        ...
        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

其次,您应该考虑如何在对话框中设置默认值,以及如何重置/检索当前值。一种方法是使用一个中央设置字典存储值,并使用对话框从用户输入更新它:

class SettingsWindow(QtGui.QDialog):
    ...
    def getValues(self):
        return {
            'max': self.ui_max.value(),
            'min': self.ui_min.value(),
            'count': self.ui_count.value(),
            }

    def setValues(self, settings):
        self.ui_max.setValue(settings['max'])
        self.ui_min.setValue(settings['min'])
        self.ui_count.setValue(settings['count'])

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        ...
        # default values
        self.settings = {
            'max': 5,
            'min': 10,
            'count': 25,
            }

    def open_settings(self):
        win = SettingsWindow()
        # reset from current values
        win.setValues(self.settings)
        if win.exec_() == QtGui.QDialog.Accepted:
            # update only if user clicked ok
            self.settings.update(win.getValues())

    def clicked_button(self):
        print 'Settings:'
        for key in 'max', 'min', 'count':
            print '\t%s = %s' % (key.title(), self.settings[key])

有很多方法可以解决这类问题,但这应该会给你一般的想法。

答案 1 :(得分:0)

您可以检查exec_()命令的结果,以查看对话框是被接受还是被拒绝。如果它被接受,您可以读取GUI控件的值

win = SettingsWindow()
r = win.exec_()
if r:
    min_val = win.ui_min.value()
    max_val = win.ui_max.value()
    cnt_val = win.ui_max.value()
相关问题