2

我在 QLabel 上显示了一张图片,并想在鼠标单击事件上获取坐标并在图像上绘制一个点。我能够获得坐标,但画家在标签上我的图像下方绘制点,我希望它在我的图像上方。

我的代码是:

主文件

#include "imageviewer.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    imageviewer w;
    w.showMaximized();

    return a.exec();
}

图像查看器.h

#include <QPushButton>

class imageviewer : public QLabel
{
    Q_OBJECT

public:
    explicit imageviewer(QWidget *parent = 0);

private slots:

    void mousePressEvent(QMouseEvent * e);
    void paintEvent(QPaintEvent * e);

private:

    QLabel *label1 ;
    int mFirstX;
    int mFirstY;
    bool mFirstClick;
    bool mpaintflag;

};

#endif

图像查看器.cpp

#include <QtGui>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include "imageviewer.h"
#include <QDebug>

imageviewer::imageviewer(QWidget *parent)
    : QLabel(parent)
{


    label1 = new QLabel;
    label1->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    QPixmap pm1("/home/nishu/Pictures/img_0002.jpg");
    label1->setPixmap(pm1);
    label1->adjustSize();
    label1->setScaledContents(true);

    QHBoxLayout *hlayout1 = new QHBoxLayout;
    hlayout1->addWidget(label1);

    setLayout(hlayout1);
}

void imageviewer :: mousePressEvent(QMouseEvent *e)
{
    mFirstX=0;
    mFirstY=0;
    mFirstClick=true;
    mpaintflag=false;

    if(e->button() == Qt::LeftButton)
            {
                //store 1st point
                if(mFirstClick)
                {
                    mFirstX = e->x();
                    mFirstY = e->y();
                    mFirstClick = false;
                    mpaintflag = true;
                    qDebug() << "First image's coordinates" << mFirstX << "," << mFirstY ;
                    update();

                }

            }
}

void imageviewer :: paintEvent(QPaintEvent * e)
{

    QLabel::paintEvent(e);

    if(mpaintflag)
    {
               QPainter painter(this);
               QPen paintpen(Qt::red);
               paintpen.setWidth(10);
               QPoint p1;
               p1.setX(mFirstX);
               p1.setY(mFirstY);
               painter.setPen(paintpen);
               painter.drawPoint(p1);
            }

}

帮我弄清楚到底是什么问题?

4

2 回答 2

3

用线QPainter painter(this);你设置 QPainter 在你的主小部件而不是 QLabel 的像素图上绘制。将块更改为此,它将起作用:

if(mpaintflag)
    {
           QImage tmp(label1->pixmap()->toImage());
           QPainter painter(&tmp);
           QPen paintpen(Qt::red);
           paintpen.setWidth(10);
           QPoint p1;
           p1.setX(mFirstX);
           p1.setY(mFirstY);
           painter.setPen(paintpen);
           painter.drawPoint(p1);
           label1->setPixmap(QPixmap::fromImage(tmp));
    }

编辑:

刚刚注意到,您从 QLabel 派生,而不是从 QWidget 派生,正如我自动假设的那样,查看布局。确实,您不需要在我们的班级label1内进行布局。imageviewer子类化的全部意义在于您以您想要的方式实现行为和过滤事件,然后在需要时将它们添加到主小部件

编辑2:

Imageviewer 类应该从 QLabel 派生,移除 label1 和 layout,并且不在图像上绘制,而是在 imageviewer 本身上绘制,即this. 然后你需要向你的程序添加新类,例如从 QMainwindow 或 QWidget 派生,你应该在其中包含你的imageviewer类,创建布局并将你的类添加到它,如下所示:

#include "imageviewer.h"
//.... somewhere in constructor ....
imageviewer *viewer1=new imageviewer(this); // creating new object of imageviewer
viewer1->setPixmap(...);
hlayout1->addWidget(viewer1);
于 2013-06-22T07:36:27.383 回答
-1

您从 派生了您的类QLabel,因此您不应该创建另一个QLabel *label1并将其放在标签的布局中。这没有任何意义。为什么有人会在标签中贴上标签?您需要删除label1imageviewer对象并将其用作标签。您的构造函数应仅包含以下代码:

setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
QPixmap pm1(...);
setPixmap(pm1);
adjustSize();
setScaledContents(true);

我已经检查过它是否可以解决您的问题。

于 2013-06-22T08:31:57.480 回答