从Pysid中的子窗口获取设置

2024-03-29 04:48:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个问题。你知道吗

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

  2. 如何关闭设置窗口并仅在用户按“确定”与“取消”时保存/提交更改,后者仅关闭对话框并取消更改。

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_())

Tags: selfuisettingsinitdefcountbuttonmin
2条回答

您可以检查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()

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

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])

有许多方法可以解决这类问题,但这应该给你一个大致的想法。你知道吗

相关问题 更多 >