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)

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值