【问题标题】:How to set Pyqt widget focus on a new opened item?如何将 Pyqt 小部件焦点设置在新打开的项目上?
【发布时间】:2019-05-13 12:56:16
【问题描述】:

我需要执行类似于QMessageBox.question() 所做的操作。 编写了一个包含按钮、滑块和其他内容的简单界面的应用程序。当我更改滑块的位置并释放鼠标按钮时,我需要出现一个新的小部件并让用户仅从这个新的小部件中选择选项。 据我所知QMessageBox.question 允许用户选择YesNoCancel 选项。

当问题被称为

QMessageBox.question(self, u'Notification', u'Save changes?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)

以前在主窗口上的焦点转到问题,用户只能从问题对话框中选择一些内容。

我需要用自己的按钮打开另一个类,但要保留冻结父应用程序的功能。

这是一个示例

class ResetFilter(QWidget):
    def __init__(self):
        super().__init__()
        self.centerPoint = QDesktopWidget().availableGeometry().center()
        self.width = 320
        self.height = 50
        self.initUI()
    def initUI(self):

        self.setWindowFlags(QtCore.Qt.Window | Qt.WindowStaysOnTopHint)
        self.grid = QGridLayout(self) 
        self.setLayout(self.grid)

        hbox_ques = QHBoxLayout()
        self.grid.addLayout(hbox_ques, 0, 0)

        self.yes = QPushButton(self)
        self.yes.setGeometry(80, 20, 50, 50)
        self.yes.setText(u'YES')

        hbox_ques.addWidget(self.yes)

        self.no = QPushButton(self)
        self.no.setGeometry(140, 20, 50, 50)
        self.no.setText(u'NO')

        hbox_ques.addWidget(self.no)

        self.tmnt = QPushButton(self)
        self.tmnt.setGeometry(200, 20, 50, 50)
        self.tmnt.setText(u'TERMINATE')

        hbox_ques.addWidget(self.tmnt)

        self.setGeometry(self.centerPoint.x() - self.width/2, self.centerPoint.y() - self.height/2, self.width, self.height)

        self.show()


class Pio(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        centerPoint = QDesktopWidget().availableGeometry().center()
        self.setWindowFlags(QtCore.Qt.Window | Qt.WindowStaysOnTopHint)
        self.launch = False

        self.grid = QGridLayout(self) 
        self.setLayout(self.grid)

        hbox_lbl = QHBoxLayout()

        self.grid.addLayout(hbox_lbl, 0, 0)
        self.slider = QSlider(Qt.Horizontal)
        self.slider.sliderReleased.connect(self.ids_change)


        hbox_lbl.addWidget(self.slider)

        self.move(centerPoint.x() - self.width()/2, centerPoint.y() - self.height()/2)
        self.show()

    def ids_change(self):
        self.item_reset = ResetFilter()
        self.item_reset.show()
        self.item_reset.setFocusPolicy(Qt.StrongFocus)

mainWin = Pio()       
mainWin.show()

【问题讨论】:

    标签: python pyqt focus pyqt5


    【解决方案1】:

    如果我正确理解您的问题,您希望在弹出窗口打开时冻结主窗口。要实现这一点,您可以将ResetFilter 设为QDialog 的子类并使其成为模态,例如

    class ResetFilter(QDialog):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.setModal(True)
            # rest as before
    

    Pio.ids_change 中,您需要以self 作为其父项来启动ResetFilter,例如

        def ids_change(self):
            self.item_reset = ResetFilter(self)
    

    【讨论】:

    • 我最近找到了几乎相同的解决方案。在ResetFilter 的初始化函数中粘贴self.setWindowModality(Qt.ApplicationModal),从现在开始它可以按我的意愿工作
    猜你喜欢
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多