• 23410阅读
  • 8回复

关于QPushButton的背景图片和文字同时显示!!! [复制链接]

上一主题 下一主题
离线rockyluo
 

只看楼主 倒序阅读 楼主  发表于: 2009-02-05
— 本帖被 XChinux 执行加亮操作(2009-02-05) —
一个按钮先设置其背景图片,再用setText()设置文字。
“调用setText后设置的背景图片不见了,显示的是按钮的默认背景色。”
向下查了下源代码,QPushButton的setText继承自QButton
QButton的setText()为:
  1. void QButton::setText( const QString &text )
  2. {
  3.     if ( btext == text )
  4.     return;
  5.     btext = text;
  6.     if ( bpixmap ) {
  7.     delete bpixmap;
  8.     bpixmap = 0;
  9.     }
  10.     if ( autoresize )
  11.     adjustSize();
  12. #ifndef QT_NO_ACCEL
  13.     setAccel( QAccel::shortcutKey( btext ) );
  14. #endif
  15.     update();
  16.     updateGeometry();
  17. }


看了下,上面的
  if ( bpixmap ) {
    delete bpixmap;
    bpixmap = 0;
    }

似乎把背景图片给删掉了
敢问有什么方法让图片和文字同时显示在按钮上???

附:  因为开发的嵌入式的  没有CSS...强大功能
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线duduqq

只看该作者 1楼 发表于: 2009-02-05
我做的是重载了QPushButton,版本是QT4.4.3

QCustButton.h
-------------------------------------
#include <QtGui>
//
class QCustButton : public QPushButton
{
public:
    QCustButton(QWidget *parent);
protected:
    void enterEvent(QEvent * event) ;
    void leaveEvent ( QEvent * event ) ;
    void mousePressEvent(QMouseEvent *event) ;
    void mouseReleaseEvent(QMouseEvent *event) ;
    void paintEvent(QPaintEvent *event) ;   
};

#endif

QCustButton.cpp
------------------------------
#include "QCustButton.h"

QCustButton::QCustButton(QWidget *parent):QPushButton(parent)
{
    setIcon(QIcon(QString::fromUtf8(":/buttonNor.png"))) ;
}

void QCustButton::paintEvent(QPaintEvent *event)
{
    QPushButton::paintEvent(event) ;
    QPainter painter(this) ;
    if(objectName() == "btLoad")
        painter.drawText(rect(),Qt::AlignCenter,QApplication::translate("CustButton", "Login", 0, QApplication::UnicodeUTF8));
    if(objectName() == "btCancel")
        painter.drawText(rect(),Qt::AlignCenter,QApplication::translate("CustButton", "Exit", 0, QApplication::UnicodeUTF8));
    return ;
}

 
void QCustButton::enterEvent(QEvent * event)
{
    setIcon(QIcon(QString::fromUtf8(":/buttonOn.png"))) ;
    return QPushButton::enterEvent(event) ;
}

void QCustButton::leaveEvent ( QEvent * event )
{
    setIcon(QIcon(QString::fromUtf8(":/buttonNor.png"))) ;
    return QPushButton::leaveEvent(event) ;
}

void QCustButton::mousePressEvent(QMouseEvent *event)
{
    setIcon(QIcon(QString::fromUtf8(":/buttonPre.png"))) ;
    return QPushButton::mousePressEvent(event) ;
}

void QCustButton::mouseReleaseEvent(QMouseEvent *event)
{
    setIcon(QIcon(QString::fromUtf8(":/buttonNor.png"))) ;
    return QPushButton::mouseReleaseEvent(event) ;
}

你把图片换成自己的图片试试,还有文本也要换
[ 此贴被duduqq在2009-02-11 20:01重新编辑 ]
离线rockyluo

只看该作者 2楼 发表于: 2009-02-05
先谢谢!!!
把你的代码弄了半天, 你是用哪个版本的Qt库,代码中好些东西在我这儿不能用(我Qt库版本为2.3.7的  )
代码中setIcon()能编译通过,但运行图片显示不出来。后来用QPushButton类创建的对象调setIcon(),还是没反应。
可能Qt本身问题,暂且不管。我换用setPixmap(),并用你的那个类,倒是成了!文字也能显示。
但效果不理想!
当按钮按下,图片到能随按钮 时起时落的,但文字不行,文字好像没放在按钮上的,不知道你的是不是这种状态?
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线ghnie

只看该作者 3楼 发表于: 2009-02-05
重载QPUshButton的paintEvent
在paintEvent中用painter.drawPixmap画出背景图片
离线chrisopal
只看该作者 4楼 发表于: 2009-02-05
if you want to subclass QPushButton, get your own style button, you have to overwrite
void QPushButton::initStyleOption ( QStyleOptionButton * option ) const;

QStyleOptionButton contains all the information you want to draw your own style button, like icon, text, icon can be pixmap.

Generally , in Qt, if you'd like to draw button, checkbox , combobox of your ow style, QStyle or QStyleOption classed are worth of reference.

overwrite painterEvent() usually in case that you want to redraw the GUI along the timeline
只看该作者 5楼 发表于: 2009-02-05
引用第2楼rockyluo于2009-02-05 16:49发表的  :
先谢谢!!!
把你的代码弄了半天, 你是用哪个版本的Qt库,代码中好些东西在我这儿不能用(我Qt库版本为2.3.7的  )
代码中setIcon()能编译通过,但运行图片显示不出来。后来用QPushButton类创建的对象调setIcon(),还是没反应。
可能Qt本身问题,暂且不管。我换用setPixmap(),并用你的那个类,倒是成了!文字也能显示。
但效果不理想!
.......

2.3.7这也太老了点吧……

Qt for Embedded Linux includes support for widget style sheets.
如果是ce,那就无法了
离线duduqq

只看该作者 6楼 发表于: 2009-02-06
我的是Qt4.4.3了。
你可以试试先把文字画到一张图片上,再把图片加到按钮上。
离线rockyluo

只看该作者 7楼 发表于: 2009-02-06
唉 干脆文字做在图片上再直接在按钮上加图片得了
省得画这画那的
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线carey_hi
只看该作者 8楼 发表于: 2009-02-11
重载了QPushButton,对于QCustButton.cpp文件中的paintevent事件重写如下,就可以同时绘制图片和显示文字了。

void QCustButton::paintEvent(QPaintEvent *event)
{
    QPushButton::paintEvent(event) ;
    QPainter painter(this) ;
    QPixmap pixmap("open.xpm");
  painter.drawPixmap(10,10,pixmap,50,50,50,50);   
  painter.drawText(rect(),Qt::AlignCenter,"Button");
  return ;
}

二楼duduqq程序中不能通过的setIcon(QIcon(QString::fromUtf8(":/buttonNor.png"))) ;
在qt中不能支持,改为setIconSet(QIconSet( QPixmap("open.xpm") )) ;就可以用来设置icon了。
快速回复
限100 字节
 
上一个 下一个