因为一个错误的决定使用了QMenu来写列表,后来发现QMenu在QScrollArea里面无法起到预期的效果百度,必应,谷歌都查了,没有找到解决方法,还有人劝退换控件重新写。
查了好多资料,做后看QScrollArea的源码发现了qSmartMinSize()函数会测量QScrollArea里的控件的minSize,这个size决定了滚动条什么时候起效。这个size就是QWidget的minimumSize。而QMenu的minimumSize默认都为0,所以QScrollArea无法起到效果。只要调用setMinimumSize或者setMinimumHeight、setMinimumWidth就行。
下面这段代码展示了一个固定在窗口上的自定义menu,重载resizeEvent在该事件中监控action数目的变化,action数目变化后需要重新设置minimumHeight
MENU_ACTION_HEIGHT=25
class MyMenu(QMenu,QWidget):
def __init__(self, parent=None):
super(MyMenu,self).__init__(parent)
self.lastActionNum = 0
def mouseReleaseEvent(self, e):
action=self.actionAt(e.pos())
if action:
action.activate(QAction.Trigger)
def resizeEvent(self, e):
n=len(self.actions())
if self.lastActionNum!=n:
self.lastActionNum=n
self.setMinimumHeight(n*MENU_ACTION_HEIGHT)