如何在悬停的图像上绘制框架

时间:2015-09-02 06:56:40

标签: c++ qt

我正在考虑一些关于标题的问题因为我有一个问题如何命名。我在Qt和C ++编程,我可以使用清晰的基本结构。现在我想做一些更有效的事情,但我不知道什么是最好的解决方案。所以我在主窗口中有一个图像。我该如何解决这个问题:

如果我将鼠标光标移动到图像的特定区域,则程序应在该区域周围绘制黄色框。如果我将鼠标移动到此图像的其他部分,则此帧应该消失。在伪代码中:

if(mouse_X >= 100 && mouse_X <=150 && 
     mouse_Y >= 250 && mouse_Y <= 300)
    drawFrame();

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题。

其中一个可能是使用事件过滤器作为问题中所述的@nwp。但是,还需要跟踪图像中的鼠标移动。

我不知道你是如何加载图片的,所以下一个代码只是一个例子,假设你在QLabel加载图像。你必须使这个想法适应你自己的项目。

<强>的main.cpp

#include "mywindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWindow myWindow;
    myWindow.show();
    return app.exec();
}

<强> mywindow.h

#ifndef _MAINWINDOW_H
#define _MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QDebug>

class MyWindow: public QWidget {
    Q_OBJECT    

public:
    MyWindow();
    ~MyWindow();
    bool eventFilter(QObject *object, QEvent *event);

private:
    QLabel *imageLabel;
};

#endif

<强> mywindow.cpp

#include "mywindow.h"
#include <QPixmap>
#include <QEvent>
#include <QMouseEvent>

MyWindow::MyWindow()
{
    imageLabel = new QLabel(this);
    imageLabel->setPixmap(QPixmap(":icon"));
    imageLabel->resize(imageLabel->pixmap()->size());
    qDebug() << imageLabel->pixmap()->size();

    imageLabel->setMouseTracking(true);
    imageLabel->installEventFilter(this);
}

MyWindow::~MyWindow()
{
}

bool MyWindow::eventFilter(QObject *object, QEvent *event)
{
    if (object == imageLabel && event->type() == QEvent::MouseMove) {
        /*
         * We know the image is 60x60 px.
         */
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
        if(mouseEvent->x() >= 0 && mouseEvent->x() <=30 &&
           mouseEvent->y() >= 0 && mouseEvent->y() <= 30)
        {
            qDebug() << "drawFrame()";
        } else {
            qDebug() << "!drawFrame()";
        }
        return false;
    }

    return false;
}