• 11760阅读
  • 15回复

自定义QPushButton 运行后怎么闪烁厉害(附代码)? [复制链接]

上一主题 下一主题
离线rockyluo
 

只看楼主 倒序阅读 楼主  发表于: 2008-12-15
— 本帖被 XChinux 执行加亮操作(2009-01-06) —
  1. PushButton::PushButton( QWidget * parent ,const char *name ):QPushButton(parent ,name)
  2. {
  3. }
  4. void PushButton::drawButton ( QPainter *painter )
  5. {
  6.     QPixmap mp1("pushbutton1.png");
  7.     QPixmap mp2("pushbutton2.png");
  8.     if(this->isDown())
  9.         this->setPixmap(mp2);
  10.     else
  11.         this->setPixmap(mp1);
  12.     QPushButton::drawButton ( painter );
  13. }
  14. PushButton::~PushButton()
  15. {
  16. }


想实现的是 按钮按下和弹起显示不同的效果........
想问闪烁怎么解决???
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线laurentium
只看该作者 1楼 发表于: 2008-12-15
这样做一直都在判断是否按下,然后把图片画到按钮上去,肯定会闪的
一般可以用
void enterEvent ( QEvent * event );    // 鼠标进入事件
void leaveEvent ( QEvent * event );    // 鼠标离开事件
void mousePressEvent(QMouseEvent *event);    //鼠标按下事件

实现按钮的自定义三种状态图片
比如
void AbstractBtn::enterEvent ( QEvent * event )
{
    setCursor(Qt::ArrowCursor);

    QPixmap pixmap(m_hoverPixmap);
    setPixmap(pixmap);
}

void AbstractBtn::leaveEvent ( QEvent * event )
{
    QPixmap pixmap(m_normalPixmap);
    setPixmap(pixmap);
}

void AbstractBtn::mouseMoveEvent(QMouseEvent *e)
{
    e->accept();
}

void AbstractBtn::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        QPixmap pixmap(m_pressPixmap);
        setPixmap(pixmap);
    }
   
    event->accept();
}
离线rockyluo

只看该作者 2楼 发表于: 2008-12-16
这样的话,假如我不用鼠标操作,
而是定义键盘上任一按键来控制某个按钮的按下和弹起动作,
岂不是不能出现按钮背景图的改变了?
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线laurentium
只看该作者 3楼 发表于: 2008-12-16
道理一样,响应键盘事件即可
离线rockyluo

只看该作者 4楼 发表于: 2008-12-16
似乎没想的这么简单
keyPressEvent这个我会用 
但现在关键是任意一个按键均可作为按钮的快捷键
不好用诸如“Qt::LeftButton”来指定操作
我实现按钮的动作是:  按一个按键,触发一个槽函数,槽函数中首先将按钮setDown( ),然后马上启动一定时器,50ms后则把按钮弹起来!
在这么一个按钮按下再弹起的过程中想实现背景的变化的!
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线sbtree
只看该作者 5楼 发表于: 2008-12-16
看上去象是在模拟键盘操作,软件盘
windows 7 + VC++2008 + Qt4.5.2
离线xjcook

只看该作者 6楼 发表于: 2008-12-16
你可以定义一个变量来记录原来是什么状态,比如 bool oldType;
如果当前状态和以前相同的话,不处理,
这样可以保证只有状态变化时才设置图片。
试试看。
void PushButton::drawButton ( QPainter *painter )
{
  if( oldType == this->isDown())
    {
        QPushButton::drawButton ( painter );
        return;
    }
  oldType = this->isDown();
    QPixmap mp1("pushbutton1.png");
    QPixmap mp2("pushbutton2.png");
    if(this->isDown())
        this->setPixmap(mp2);
    else
        this->setPixmap(mp1);
    QPushButton::drawButton ( painter );
}
离线rockyluo

只看该作者 7楼 发表于: 2008-12-17
很好的方法  的确不闪了
但有个问题 按钮上的字显示不了
不知有什么方法来解决?

另外 ,  我先前做了个TabBar的类  是继承QTabBar的
代码为:
TabBar::TabBar( QWidget * parent ,const char *name): QTabBar( parent ,name)
{   
    this->setFocusPolicy(QWidget::NoFocus);
}

void TabBar::paint ( QPainter * p, QTab * t, bool selected ) const
{   
    QColor color(QColor_back);
    if(selected)
    {               
        QPixmap mp("label2.png");
        QBrush brush(color,mp);
        p->setBrush(brush);    //(Qt::red);               
        p->drawRect(t->rect());   
    }     
    else
    {
        QPixmap mp("label1.png");
        QBrush brush(color,mp);
        p->setBrush(brush);
        p->drawRect(t->rect());
    }
    QTabBar::paint(p, t, selected);
}

TabBar::~TabBar()
{

}
这段代码对QTabBar是可行的,它能改变QTabBar中tab的背景图,而且文字也没有被覆盖,切换tab文字也不会覆盖。

我在PushButton代码中试图用setBrush来显示PushButton上的背景图,运行出来确毫无变化。
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线stdjgwyc
只看该作者 8楼 发表于: 2008-12-19
弱弱的问一问
QPushButton中有setPixmap()这个函数啊?
QT交流群群号:2906359,(200人大群,持续升级)
离线lazybone
只看该作者 9楼 发表于: 2008-12-19
没 ,要不用 css, 要不加图标
离线stdjgwyc
只看该作者 10楼 发表于: 2008-12-19
setStyleSheet("border-image:url(./btn1.jpg); font-size:24px");
这样没有按钮按下去的效果~~这个怎么实现~~

如果想设置按下去的背景图片呢
QT交流群群号:2906359,(200人大群,持续升级)
离线lazybone
只看该作者 11楼 发表于: 2008-12-19
ui.pushButton.setStyleSheet("QPushButton:pressed {background-color:black;}");
离线rockyluo

只看该作者 12楼 发表于: 2008-12-20
玩的是Qt/E
没CSS那高级东西.........
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线stdjgwyc
只看该作者 13楼 发表于: 2008-12-20
引用第11楼lazybone于2008-12-19 10:10发表的  :
ui.pushButton.setStyleSheet("QPushButton:pressed {background-color:black;}");

谢谢~~~看到这个受到启发
在Assistant里找到了相关的语法~~~~~~~~~~~~
所有语法都在
Qt Style Sheets Reference中有
QT交流群群号:2906359,(200人大群,持续升级)
离线fantalin
只看该作者 14楼 发表于: 2008-12-22
setStyleSheet("border-image:url(./btn1.jpg); font-size:24px");
问一下,这个("border-image:url(./btn1.jpg); 的图片路径是可执行文件的当前目录吗?
名字是自己起的吗,我用了怎么没有反应?
离线fantalin
只看该作者 15楼 发表于: 2008-12-22
setStyleSheet("border-image:url(./btn1.jpg); font-size:24px");
问一下,这个("border-image:url(./btn1.jpg); 的图片路径是可执行文件的当前目录吗?
名字是自己起的吗,我用了怎么没有反应?
快速回复
限100 字节
 
上一个 下一个