Как установить фокус виджета Pyqt на новый открытый элемент? - PullRequest
1 голос
/ 13 мая 2019

Мне нужно сделать действие, подобное тому, что делает QMessageBox.question().Написал приложение, которое имеет простой интерфейс, содержащий кнопки, ползунки и другие вещи.Когда я меняю положение ползунка и отпускаю кнопку мыши, мне нужен новый виджет, который позволяет пользователю выбирать опции только из этого нового виджета.Насколько я знаю, QMessageBox.question позволяет пользователю выбирать опции Yes, No или Cancel.

Когда вопрос вызывается как

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

1 Ответ

1 голос
/ 13 мая 2019

Если я правильно понимаю ваш вопрос, вы хотите заморозить главное окно, пока открыто всплывающее окно. Для достижения этого вы можете сделать ResetFilter подклассом QDialog и сделать его модальным, например

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

В Pio.ids_change вам нужно будет инициировать ResetFilter с self в качестве его родителей, например,

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