开发者社区> 问答> 正文

PySide在QSpinBox中获取箭头按钮的宽度

有没有办法确定qspinbox中箭头按钮的宽度?我正在尝试覆盖上下文菜单事件,我只希望我的自定义事件发生,如果用户右键单击箭头按钮,否则我希望显示正常的上下文菜单。

现在我只是硬编码20的值并不理想。

import sys
import os
from PySide import QtGui, QtCore

class MySpinner(QtGui.QSpinBox):

def __init__(self, parent=None):
    super(MySpinner, self).__init__(parent)
    self.setAccelerated(False)
    self.setRange(-1000,1000)
    self.setSingleStep(1)
    self.setValue(300)

def contextMenuEvent(self, event):
    if event.pos().x() > self.rect().right()-20:
        self.setValue(50)
        self.selectAll()
    else:
        super(self.__class__, self).contextMenuEvent(event)

class MainWindow(QtGui.QMainWindow):

def __init__(self, parent=None):
    super(MainWindow, self).__init__(parent)
    self.resize(300, 200)

    grid = QtGui.QVBoxLayout()
    grid.addWidget(MySpinner())
    content = QtGui.QWidget()
    content.setLayout(grid)
    self.setCentralWidget(content)

def main():

app = QtGui.QApplication(sys.argv)
ex = MainWindow()
ex.show()

sys.exit(app.exec_())

if name == '__main__':

main()

展开
收起
一码平川MACHEL 2019-01-22 14:19:13 2347 0
1 条回答
写回答
取消 提交回答
  • 不需要获得宽度,只需要获取SubControl以知道它是否在其中一个箭头按钮中被按下:

    def contextMenuEvent(self, event):

    opt = QtGui.QStyleOptionSpinBox()
    self.initStyleOption(opt)
    opt.subControls = QtGui.QStyle.SC_All
    hoverControl = self.style().hitTestComplexControl(QtGui.QStyle.CC_SpinBox, opt, event.pos(), self)
    if hoverControl == QtGui.QStyle.SC_SpinBoxUp:
        print("up")
    elif hoverControl == QtGui.QStyle.SC_SpinBoxDown:
        print("down")
    else:
        super(self.__class__, self).contextMenuEvent(event)

    如果你想得到你应该使用的每个子控制的QRect

    up

    rect_up = self.style().subControlRect(QtGui.QStyle.CC_SpinBox, opt, QtGui.QStyle.SC_SpinBoxUp, self)

    down

    rect_down = self.style().subControlRect(QtGui.QStyle.CC_SpinBox, opt, QtGui.QStyle.SC_SpinBoxDown, self)
    另外一个选项:

    def contextMenuEvent(self, event):

    opt = QtGui.QStyleOptionSpinBox()
    self.initStyleOption(opt)
    r = QtCore.QRect()
    for sc in (QtGui.QStyle.SC_SpinBoxUp, QtGui.QStyle.SC_SpinBoxDown):
        r= r.united(self.style().subControlRect(QtGui.QStyle.CC_SpinBox, opt, sc, self))
    if r.contains(event.pos()):
        print("arrow")
    else:
        super(self.__class__, self).contextMenuEvent(event)
    2019-07-17 23:26:16
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载