QRect QStyle::subControlRect

本文介绍如何使用QStyle::subControlRect方法获取复杂控件中子控件的矩形区域。此方法适用于屏幕坐标系下指定样式风格的子控件定位。

QRect QStyle::subControlRect(ComplexControlcontrol, const QStyleOptionComplex * option,SubControl subControl, const QWidget * widget = 0) const [pure virtual]

>>>>>>>>>>>>>>>>

Returns the rectangle containing the specified subControl of the given complex control (with the style specified by option). The rectangle is defined in screen coordinates.


返回包含ComplexControlsubControl 指定的矩形(由option来指定这种风格)。这个矩形由屏幕坐标系来定。



The option argument is a pointer to QStyleOptionComplex or one of its subclasses, and can be cast to the appropriate type using theqstyleoption_cast() function. See drawComplexControl() for details. The widget is optional and can contain additional information for the function.


option的参数是一个QStyleOptionComplex类型的指针或者它的子类的指针,并且可以通过qstyleoption_cast()函数来被指明为一个适当的类型。通过drawComplexControl()查看更过细节。widget 参数是可选的,可以为函数提过附加功能信息。



void paintGroove(QPainter& painter) { painter.save(); QRect grooveRect = style()->subControlRect(QStyle::CC_Slider, getStyleOption(), QStyle::SC_SliderGroove, this); // 绘制滑道背景 painter.setPen(Qt::NoPen); painter.setBrush(grooveColor); painter.drawRect(grooveRect); painter.restore(); } void paintHighlight(QPainter& painter) { painter.save(); QRect grooveRect = style()->subControlRect(QStyle::CC_Slider, getStyleOption(), QStyle::SC_SliderGroove, this); // 计算高亮区域 int handlePos = sliderPositionFromValue(minimum(), maximum(), value(), height() - 42); QRect highlightRect(grooveRect.x(), handlePos + 21, 7, grooveRect.bottom() - handlePos - 21); painter.setPen(Qt::NoPen); painter.setBrush(highlightColor); painter.drawRect(highlightRect); painter.restore(); } void paintTicks(QPainter& painter) { painter.save(); painter.setPen(Qt::gray); // 计算刻度位置 int grooveLeft = width()/2 - 3; // 滑道左边界 int leftTickX = grooveLeft - grooveMargin - tickLength; int rightTickX = grooveLeft + 7 + grooveMargin; // 绘制左右刻度 for(int val = minimum(); val <= maximum(); val += singleStep()) { int yPos = sliderPositionFromValue(minimum(), maximum(), val, height() - 42) + 21; painter.drawLine(leftTickX, yPos, leftTickX + tickLength, yPos); // 左侧刻度 painter.drawLine(rightTickX, yPos, rightTickX + tickLength, yPos); // 右侧刻度 } painter.restore(); } void paintHandle(QPainter& painter) { if(!svgRenderer) return; QStyleOptionSlider opt = getStyleOption(); QRect handleRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); // 渲染SVG QPixmap pixmap(24, 42); pixmap.fill(Qt::transparent); QPainter p(&pixmap); svgRenderer->render(&p, QRect(0, 0, 24, 42)); painter.drawPixmap(handleRect.topLeft(), pixmap); } QStyleOptionSlider getStyleOption() const { QStyleOptionSlider opt; initStyleOption(&opt); return opt; } 优化
03-29
bool ucCali_Drunk::eventFilter(QObject *watched, QEvent *event) { // 处理所有QComboBox的鼠标点击事件 QVector<QComboBox*> comboBoxes = { ui->comboBox_degEdu, ui->comboBox_licensePlate, ui->comboBox_TravelMode, ui->comboBox_bloodInstitution }; for (QComboBox* comboBox : comboBoxes) { // 处理所有点击事件(包括本体和lineEdit) if ((watched == comboBox || watched == comboBox->lineEdit()) && event->type() == QEvent::MouseButtonPress) { QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); // 如果是可编辑的QComboBox,直接触发completer if (comboBox->isEditable()) { if (QCompleter *completer = comboBox->completer()) { // 设置当前文本为过滤条件 completer->setCompletionPrefix(comboBox->currentText()); // 显示自定义下拉框 completer->complete(); } return true; // 拦截事件,阻止原生下拉框 } // 对于不可编辑的QComboBox,检查是否点击了下拉箭头 QStyleOptionComboBox opt; opt.initFrom(comboBox); QRect arrowRect = comboBox->style()->subControlRect( QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxArrow, comboBox); if (arrowRect.contains(mouseEvent->pos())) { if (QCompleter *completer = comboBox->completer()) { completer->complete(); } return true; // 拦截事件 } } } // 拦截原生下拉框的显示事件 if (event->type() == QEvent::Show) { for (QComboBox* comboBox : comboBoxes) { if (watched == comboBox->view()) { comboBox->hidePopup(); return true; } } } return QWidget::eventFilter(watched, event); }点击上述的combobox的最右侧按钮位置,原生的下拉框和自定义的下拉框交替出现,需要点击时每次都出现自定义的下拉框,在不改变右侧按钮样式的前提下,需要优化解决这个问题
最新发布
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值