2015-07-30 5 views
2

В моем инструменте, когда пользователь нажимает кнопку, создается всплывающее окно. Моя проблема заключается в том, что кнопка, которую пользователь нажимает, чтобы открыть окно, остается подсвеченной (как если бы я на ней наводил указатель мыши) при создании всплывающих окон и оставался таким же образом даже после удаления всплывающего окна. Мне действительно нравится это выделение, пока всплывающее окно активно (оно визуально связывает окно с всплывающим окном, которое хорошо), но я бы хотел, чтобы оно исчезло, когда окно было удалено.PySide: QPushButton остается выделенным после нажатия

Ниже приведен пример, чтобы выяснить, что происходит:

enter image description here

Если я нажимаю на создание актива, а затем нажмите на минорный сохранить создание активов кнопка будет подсвечиваться

КОД:

from PySide import QtCore, QtGui 
import maya.OpenMayaUI as mui 
from shiboken import wrapInstance 

def get_parent(): 
    ptr = mui.MQtUtil.mainWindow() 
    return wrapInstance(long(ptr), QtGui.QWidget) 

############################################ 
class Tool_Window(QtGui.QDialog): 
    def __init__(self, parent = get_parent()): 
     super(Tool_Window, self).__init__(parent) 

     # Commands 
     self.create_gui() 
     self.create_layout() 
     self.create_connections() 

    #------------------------------------------- 
    def create_gui(self): 
     self.button1 = Push_Buttons() 
     self.button1.setMaximumWidth(50) 
     self.button2 = Push_Buttons() 
     self.button2.setMaximumWidth(50) 

    #------------------------------------------- 
    def create_layout(self): 
     layout = QtGui.QVBoxLayout() 
     layout.addWidget(self.button1) 
     layout.addWidget(self.button2) 
     blank_layout = QtGui.QVBoxLayout() 
     main_layout = QtGui.QHBoxLayout(self) 
     main_layout.addLayout(blank_layout) 
     main_layout.addLayout(layout) 
     self.setLayout(layout) 

    #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# 
    def create_connections(self): 
     # Left click 
     self.button1.clicked.connect(self.on_left_click) 
     self.button2.clicked.connect(self.on_left_click) 

    #-----#-----#-----#-----#-----#-----#-----#-----#-----#  
    def on_left_click(self): 

     button = self.sender() 

     self.popup = Popup_Window(self, button)     
     self.popup.show() 

############################################ 
class Push_Buttons(QtGui.QPushButton): 
    def __init__(self): 
     super(Push_Buttons, self).__init__() 

     self.setFocusPolicy(QtCore.Qt.NoFocus) 

############################################ 
class Popup_Window(QtGui.QWidget): 
    def __init__(self, parent, button): 
     super(Popup_Window, self).__init__(parent) 

     self.setWindowFlags(QtCore.Qt.Popup) 

     self.button_pos = button  
     self.parent = parent 

     self.setAttribute(QtCore.Qt.WA_DeleteOnClose) 
     self.resize(230, 100) 

     self.installEventFilter(self) 

     self.create_gui() 
     self.create_layout() 
     self.create_connections() 
     self.move_UI() 
     self.line_edit.setFocus()  

    #------------------------------------------- 
    def create_gui(self): 
     ''' Visible GUI stuff ''' 
     self.my_label = QtGui.QLabel("default text") 
     self.line_edit = QtGui.QLineEdit() 
     self.line_edit.setMaxLength(30) 
     self.push_btn = QtGui.QPushButton("push") 
     self.push_btn.setMaximumWidth(30) 

    #------------------------------------------- 
    def create_layout(self): 

     self.button_layout = QtGui.QVBoxLayout() 

     self.button_layout.addWidget(self.my_label, 0, 0) 
     self.button_layout.addWidget(self.line_edit, 1, 0) 
     self.button_layout.addWidget(self.push_btn, 2, 0) 

     self.setLayout(self.button_layout) 

    #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# 
    def create_connections(self): 

     self.line_edit.textChanged.connect(self.on_text_changed) 

    #-----#-----#-----#-----#-----#-----#-----#-----#-----# 
    def on_text_changed(self, text): 

     #---- set the text in label ---- 
     typed_name = self.line_edit.text() 
     if " " in typed_name: 
      typed_name.replace(" ", "") 
     self.my_label.setText(typed_name) 

    #------------------------------------------- 
    def eventFilter(self, source, event): 

     if event.type() == QtCore.QEvent.WindowDeactivate: 
      self.close() 
     return QtGui.QWidget.eventFilter(self, source, event) 

    #------------------------------------------- 
    def move_UI(self): 
     self.line_edit.setFocus() 
     y_btn = self.button_pos.mapToGlobal(QtCore.QPoint(0,0)).y() 
     x_win = self.parent.mapToGlobal(QtCore.QPoint(0,0)).x() 

     w_pop = self.frameGeometry().width() 

     x = x_win - w_pop - 12 
     y = y_btn 

     self.move(QtCore.QPoint(x,y)) 

############################################ 
if __name__ == '__main__': 
    # Things to fix PySide Maya bug 
    try: 
     test_ui.close() 
     test_ui.deleteLater() 
    except: 
     pass 

    test_ui = Tool_Window() 
    test_ui.show() 

    try: 
     test_ui.show() 
    except: 
     test_ui.close() 
     test_ui.deleteLater() 
+1

То, что вы просите, не так просто достичь, как кажется. Вы можете полностью отключить подсветку кнопки, выполнив 'button.setFocusPolicy (QtCore.Qt.NoFocus)'. Однако, чтобы иметь возможность программно контролировать выделение кнопки, я думаю, вам придется подклассифицировать QPushButton и нарисовать кнопку самостоятельно. Я не знаю более простого способа. Я попытаюсь привести пример, чтобы показать вам, как это можно сделать. –

+0

В моем полном коде у меня есть подкласс QPushButtons, но я понятия не имею, как использовать контекстно-ориентированную политику, так что спасибо за помощь! В то же время я пытался настроить фокусную политику подкласса QPushButton на отсутствие фокуса, и это, похоже, не имеет эффекта. Я добавил обновление к моему коду, чтобы показать это –

+0

. Не могли бы вы не сосредоточиться на другом элементе на 'self.button1.released'? –

ответ

2

Я не смог воспроизвести вашу проблему, когда проводилась политика фокуса t до значения по умолчанию как для Windows 7, так и для Ubuntu (QtCore.Qt.FocusPolicy.StrongFocus). Однако это было в обеих системах после того, как я установил политику фокуса кнопок на QtCore.Qt.FocusPolicy.NoFocus.

Чтобы решить эту проблему, я полагаю, на данный момент, чтобы заставить перекрасить экземпляр Tool_Window, от eventFilter способа Popup_Window, когда близкое событие регистрируются, как показано ниже:

def eventFilter(self, source, event): 

    if event.type() == QtCore.QEvent.WindowDeactivate: 
     self.close() 
    elif event.type() == QtCore.QEvent.Close: 
     self.parent.repaint() 
    return QtGui.QWidget.eventFilter(self, source, event) 

Он решил проблему как для Windows7, так и для Ubuntu для меня, когда фокусная политика кнопки была установлена ​​на QtCore.Qt.FocusPolicy.NoFocus. Я могу исследовать дальше, чтобы лучше понять, что происходит, я буду держать вас в курсе.

примечание стороны: Я не тестирование кода с OpenMayaUI, так что, возможно, именно поэтому я не получаю вопрос по умолчанию, но только после того, как я явно установить политику фокусировки кнопок для NoFocus. Возможно, OpenMayaUI заставит ваши кнопки иметь политику NoFocus по умолчанию. Это может быть также из-за различий между нашей ОС и темой.

+0

Привет, Жан-Себастьен, спасибо за ваш ответ и извините за задержку. Я работаю в циклах и снова начал возвращаться к моей разработке кода. Я просто хотел сообщить вам, что я опробовал ваше решение, но оно не меняет проблему с кнопкой. –

Смежные вопросы