在我的工具中,当用户按下按钮时,会创建一个弹出窗口。我的问题是,用户按下以显示窗口的按钮在弹出窗口创建时保持突出显示(就好像我的鼠标悬停在它上面)并且即使在删除弹出窗口后仍保持这种状态。我实际上喜欢这个突出显示,而弹出窗口是活动的(它可视地将窗口连接到弹出窗口,这是很好的),但我希望它在窗口被删除时消失。
下面是一个澄清正在发生的事情的例子:
如果我点击创建资产,然后点击次要保存创建资产按钮保持突出显示
CODE:
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()
答案 0 :(得分:2)
当焦点策略在Windows 7和Ubuntu(QtCore.Qt.FocusPolicy.StrongFocus
)上设置为默认值时,我无法重现您的问题。但是,在我将按钮的焦点策略设置为QtCore.Qt.FocusPolicy.NoFocus
后,它就在两个系统上。
要解决此问题,我建议暂时在Tool_Window
的{{1}}方法中强制重新显示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
政策。也可能是因为我们的操作系统和主题之间存在差异。
答案 1 :(得分:0)
在Maya 2018上我也遇到了这个问题。我认为这可能是Maya的事情吗?我最终最终只是重写了鼠标单击事件,就像鼠标单击+释放事件一样-使其从未真正进入按下状态:
def mousePressEvent(self, event):
super(DragButton, self).mouseReleaseEvent(event)
我也尝试过的事情:
QPushButton().setDown(False)
QPushButton().setChecked(False)
QPushButton().setPressed(False)
QPushButton().setFocusPolicy(QtCore.Qt.NoFocus)
QPushButton().setFocusPolicy(QtCore.Qt.StrongFocus)
QPushButton().viewport().update()
event.accept()
QtCore.QTimer.singleShot(
100, lambda: self.setFocusPolicy(QtCore.Qt.NoFocus)
)
QtCore.QTimer.singleShot(100, lambda: self.setDown(False))
super(DragButton, self).mousePressEvent(event)
无论我尝试什么,我都会看到下面显示的内容,单击并拖动后,黑色按钮一直被永久按下,尽管如果我单击它们也可以:
答案 2 :(得分:0)
由于某些原因,当您的Popup_Window
类使用self.setWindowFlags(QtCore.Qt.Popup)
时,高亮部分似乎仍然存在。
您可以删除该行,并使Popup_Window
类继承自QDialog
。现在,当新窗口出现时,高光将不再保留。尽管您最初的行为是只能与弹出窗口一起显示,但要实现相同的效果,只需调用self.popup.exec_()
而不是self.popup.show()
使其具有模式即可。
现在,它的工作就像没有按钮“保持”到突出显示状态一样。