• 17858阅读
  • 9回复

[提问]重绘QPushButton,如何让button大小适应图片大小[已解决] [复制链接]

上一主题 下一主题
离线pssslpb
 

只看楼主 倒序阅读 楼主  发表于: 2011-09-19
想重绘QPushButton,重写了paintEvent方法。但是button大小总是改不了,请问有什么方法让button大小适应图片大小。
void MPushButton::paintEvent(QPaintEvent* e)
{
    QPainter painter(this);

    QPixmap iconPixmap(m_iconPath);

    painter.drawPixmap(e->rect(), iconPixmap);
    painter.drawText(e->rect(), m_text);
}
离线roywillow

只看该作者 1楼 发表于: 2011-09-19
那些东西是要在sizeHint()中做到吧
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线pssslpb

只看该作者 2楼 发表于: 2011-09-19
如何做,能不能说明确些。
离线pssslpb

只看该作者 3楼 发表于: 2011-09-19
给点意见
离线roywillow

只看该作者 4楼 发表于: 2011-09-19
一时半会说不清
文档中讲了如何子类化QWidget的,自己去看或许更明白
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线kimtaikee

只看该作者 5楼 发表于: 2011-09-19
在load pixmap时 得到pixmap的size然后调用setFixedSize(PixmapSize)

离线jdwx

只看该作者 6楼 发表于: 2011-09-20
引用第5楼kimtaikee于2011-09-19 23:30发表的  :
在load pixmap时 得到pixmap的size然后调用setFixedSize(PixmapSize)

可行!但是最好用void    setFixedHeight ( int h ),高度固定,void setMaximumWidth ( int maxw )宽度可变,能适应布局。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线pssslpb

只看该作者 7楼 发表于: 2011-09-20
可行!icon下边再画text时,高度和宽度又如何调整,text字数不定。
离线roywillow

只看该作者 8楼 发表于: 2011-09-20
其实这个就是重载sizeHint()和调用updateGeometry()的问题
sizeHint()中根据当前的信息计算出组件最合适的大小
当改变pixmap或者text之后,调用updateGeometry(),这个函数会在合适的时候调用你重载的sizeHint()来获得理想大小
想获得一段文本的尺寸可以使用fontMatrics()函数

另外如果需要及时重绘组件就需要及时调用update()


void QWidget::updateGeometry ()


Notifies the layout system that this widget has changed and may need to change geometry.
Call this function if the sizeHint() or sizePolicy() have changed.
For explicitly hidden widgets, updateGeometry() is a no-op. The layout system will be notified as soon as the widget is shown.
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线pssslpb

只看该作者 9楼 发表于: 2011-09-20
感谢各位的回帖,问题基本解决。
MPushButton::MPushButton(const QString& iconPath, const QString& text, QWidget* parent)
                        : QPushButton(parent)
{
    m_text = text;    
    m_icon = QPixmap(iconPath);
    
    setFixedHeight(m_icon.size().height() + 15);
    setMinimumWidth(m_icon.size().width());

    m_drawedIconRect.setX((rect().x() - m_icon.rect().x()) / 2);
    m_drawedIconRect.setY(rect().y());
    m_drawedIconRect.setWidth(m_icon.rect().width());
    m_drawedIconRect.setHeight(m_icon.rect().height());
}

void MPushButton::paintEvent(QPaintEvent* e)
{
    QPainter painter(this);
    painter.drawPixmap(m_drawedIconRect, m_icon);
    painter.drawText(e->rect(), Qt::AlignHCenter | Qt::AlignBottom, m_text);
}
快速回复
限100 字节
 
上一个 下一个