QMenu显示在QScrollArea里面

        因为一个错误的决定使用了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)

 

你可能感兴趣的:(QMenu显示在QScrollArea里面)