• 6097阅读
  • 6回复

请问同一个widget的event之间的调用会如何相互影响? [复制链接]

上一主题 下一主题
离线红调
 

只看楼主 倒序阅读 楼主  发表于: 2014-03-01
跟着网上的教程学的,自己又加上了一些。这是一个继承QLabel的类。
当我仅添加paintEvent的时候,正常运行。
当我仅添加mouseMoveEvent、mousePressEvent、mouseReleaseEvent的时候,同样正常运行(即label上会随着鼠标的状态显示不同的文字)。
但是当这四个事件同时存在的时候,鼠标的事件就不起作用了。可能是event之间互相影响导致的?
求指教。谢谢!

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QMouseEvent>
#include <QPainter>
class EventLabel : public QLabel
{
protected:
        void mouseMoveEvent(QMouseEvent *event);
        void mousePressEvent(QMouseEvent *event);
        void mouseReleaseEvent(QMouseEvent *event);
        void paintEvent(QPaintEvent *event);
};

void EventLabel::paintEvent(QPaintEvent *event)
{
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing, true);
        QLinearGradient linearGradient(60, 50, 200, 200);
        linearGradient.setColorAt(0.2, Qt::white);
        linearGradient.setColorAt(0.6, Qt::green);
        linearGradient.setColorAt(1.0, Qt::black);
        painter.setBrush(QBrush(linearGradient));
        painter.drawEllipse(50, 50, 200, 150);
}

void EventLabel::mouseMoveEvent(QMouseEvent *event)
{
        this->setText(QString("<center><h1>Move: (%1, %2)</h1></center>")
                                                        .arg(QString::number(event->x()), QString::number(event->y())));
}
void EventLabel::mousePressEvent(QMouseEvent *event)
{
        this->setText(QString("<center><h1>Press: (%1, %2)</h1></center>")
                                                        .arg(QString::number(event->x()), QString::number(event->y())));
}
void EventLabel::mouseReleaseEvent(QMouseEvent *event)
{
        QString msg;
        msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>",
                                event->x(), event->y());
        this->setText(msg);
}
int main(int argc, char *argv[])
{
        QApplication app(argc, argv);
        EventLabel *label = new EventLabel;
        label->setWindowTitle("MouseEvent Demo");
        label->resize(300, 200);
        label->show();
        return app.exec();
}
离线dbzhang800

只看该作者 1楼 发表于: 2014-03-01
你的paintEvent写的有问题,里面没有 显示text  相关的代码:既没有直接调用drawText(),也没有通过调用父类的paintEvent()来让其调用drawText()
离线pxiao_xiao

只看该作者 2楼 发表于: 2014-03-01
鼠标事件不起作用是个什么意思
文本不随着改变了 还是 鼠标不动了?
绘图事件里 你应该绘制的是背景
离线红调

只看该作者 3楼 发表于: 2014-03-01
回 dbzhang800 的帖子
dbzhang800:你的paintEvent写的有问题,里面没有 显示text  相关的代码:既没有直接调用drawText(),也没有通过调用父类的paintEvent()来让其调用drawText() (2014-03-01 11:22) 

谢谢你!
我的paintEvent没有调用和text有关的函数。但是我的几个mouseEvent都和text有关呀。
离线红调

只看该作者 4楼 发表于: 2014-03-01
回 pxiao_xiao 的帖子
pxiao_xiao:鼠标事件不起作用是个什么意思
文本不随着改变了 还是 鼠标不动了?
绘图事件里 你应该绘制的是背景  (2014-03-01 11:50) 

鼠标事件不起作用是指鼠标可移动,但是没有任何文字出现了。
离线dbzhang800

只看该作者 5楼 发表于: 2014-03-01
回 红调 的帖子
红调:谢谢你!
我的paintEvent没有调用和text有关的函数。但是我的几个mouseEvent都和text有关呀。 (2014-03-01 17:00) 

你这儿问题和mouse的那几个函数没关系,因为只有paintEvent时负责绘制界面的,所有界面中看到的东西,都需要在这儿画出来,哪怕你想显示一个字符A,也需要drawText()

另外,不清楚你所说“当我仅添加paintEvent的时候,正常运行”,你时如何测试的,上面可以显示文字??

不过,正常情况下,在overwrite 父类的成员时,我们都会调用一下父类的函数,比如QLabel::paintEvent(...) 来保证其原有功能仍能正常工作。
离线tlcugb

只看该作者 6楼 发表于: 2014-03-04
添加QLabel::mouseMoveEvent(event);试试!
快速回复
限100 字节
 
上一个 下一个