找回密码
 立即注册
收起左侧

mousePressEvent事件中点击鼠标填充对应坐标网格 如何实现

2
回复
8716
查看
[复制链接]
累计签到:773 天
连续签到:1 天
来源: 2013-11-28 10:35:18 显示全部楼层 |阅读模式
2Qter豆
如题,我想实现扫雷那样 鼠标点击某个小方格后,该方格的背景颜色改变效果,我的思路是:
1.paintEvent(QPaintEvent *)画网格
2.mousePressEvent(QMouseEvent *e)判断点击坐标,算出对应的方格,然后painter.fillRect()填充
但是编译无错,执行时点击鼠标后不能填充,提示信息:
QWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1


网上找了下,原因是:绘制操作应该在paintEvent中完成.
那么我怎么样才能分别用paintEvent()和mousePressEvent()实现我的思路,【不考虑用图片填充的方式】
求指点
附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

在mousePressEvent里记录点击位置,然后调用update()函数,这样QT会自动调用paintEvent(),在paintEvent函数里通过记录的点击位置信息来绘制,这样就可以了。
回复

使用道具 举报

累计签到:181 天
连续签到:1 天
2013-11-28 10:35:19 显示全部楼层
在mousePressEvent里记录点击位置,然后调用update()函数,这样QT会自动调用paintEvent(),在paintEvent函数里通过记录的点击位置信息来绘制,这样就可以了。
回复

使用道具 举报

累计签到:773 天
连续签到:1 天
2013-11-28 10:37:07 显示全部楼层
部分代码如下
void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    QPen p1(Qt::blue);
    painter.setPen(p1);
    QBrush brush(Qt::gray);//
    painter.setBrush(brush);
    for(int x=10;x<590;x+=20)
        for(int y=10;y<390;y+=20)
        {
            painter.drawRect(x,y,20,20);
        }
}

void Widget::mousePressEvent(QMouseEvent *e)
{
    QPainter painter(this);
    QPoint point;
    int p_x;
    int p_y;
    if(e->button()==Qt:eftButton)
    {
        //QWidget *action = QApplication::widgetAt(QCursor::pos()); //通过鼠标点击的坐标获取控件
        point=e->pos();
        p_x=point.rx();
        p_y=point.ry();
        //qDebug()<<e->globalPos();全局相对于屏幕坐标
        qDebug()<<e->pos();//窗体中的坐标
        painter.fillRect((p_x-10)/20*20+10,(p_y-10)/20*20+10,20,20,QBrush(Qt::red));
    }
}
环境 win7+Qt5.1.1+Mingw4.8 Qt Creator2.8.1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了