gpt4 book ai didi

focus - PySide:QPushButton 在按下后保持突出显示

转载 作者:行者123 更新时间:2023-12-05 04:15:37 27 4
gpt4 key购买 nike

在我的工具中,当用户按下按钮时,会创建一个弹出窗口。我的问题是用户按下以调出窗口的按钮在弹出窗口创建时保持突出显示(就像我将鼠标悬停在它上面一样)并且即使在删除弹出窗口后仍然保持这种状态。我实际上喜欢弹出窗口处于事件状态时的此突出显示(它在视觉上将窗口连接到弹出窗口,这很好),但我希望它在删除窗口时消失。

下面是一个例子来阐明正在发生的事情:

enter image description here

如果我点击创建 Assets ,然后点击次要保存创建 Assets 按钮保持突出显示

代码:

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

最佳答案

当焦点策略在 Windows 7 和 Ubuntu (QtCore.Qt.FocusPolicy.StrongFocus) 上设置为默认值时,我无法重现您的问题。但是,在我将按钮的焦点策略设置为 QtCore.Qt.FocusPolicy.NoFocus 之后,它出现在两个系统上。

为了解决这个问题,目前我建议从 Popup_Window eventFilter 方法强制重绘 Tool_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)

当按钮的焦点策略设置为 QtCore.Qt.FocusPolicy.NoFocus 时,它为我解决了 Windows7 和 Ubuntu 上的问题。我可能会进一步调查以更好地了解发生了什么,我会及时通知您。

旁注:我没有使用 OpenMayaUI 测试您的代码,所以也许这就是默认情况下我没有遇到问题的原因,但只有在我明确设置按钮的焦点策略为 NoFocus。也许 OpenMayaUI 会强制您的按钮在默认情况下具有 NoFocus 策略。这也可能是因为我们的操作系统和主题之间存在差异。

关于focus - PySide:QPushButton 在按下后保持突出显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31734925/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com