В настоящее время я работаю над отображением изображения уровня серого с функцией масштабирования. Я могу получить положение пикселя, и функция масштабирования работает хорошо. Однако я столкнулся с двумя проблемами:
1.) Как я могу получить значение уровня серого пикселя, на которое указывает мышь? Мне удалось получить значение rgb через “QRgb rgbValue = pix.toImage(). Pixel (x, y)”. Как я могу преобразовать его в значение уровня серого? Или есть какой-либо прямой способ получить значение уровня серого пикселя.
2.) Я реализовал “mouseMoveEvent (событие QMouseEvent *)” и “setMouseTracking (true)”. Однако функция “mouseMoveEvent (событие QMouseEvent *)” не работает, когда я перемещаю мышь. Что не так с моим кодом?
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsItem>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
protected:
void mouseMoveEvent(QMouseEvent * event);
private:
Ui::MainWindow *ui;
QGraphicsScene* scene;
QGraphicsItem* item;
QPixmap pix;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QImage image("E:/image_00002.bmp");
pix = QPixmap::fromImage(image);
scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);
scene->addPixmap(pix);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
ui->graphicsView->setMouseTracking(true);
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
QPoint local_pt = ui->graphicsView->mapFromGlobal(event->globalPos());
QPointF img_coord_pt = ui->graphicsView->mapToScene(local_pt);
double x = img_coord_pt.x();
double y = img_coord_pt.y();
/* How can I get a gray level image here */
QRgb rgbValue = pix.toImage().pixel(x,y);
ui->label_X->setText(QString::number(x));
ui->label_Y->setText(QString::number(y));
ui->label_Value->setText(QString::number(rgbValue));
}
Поразмыслить над тем, что сказал Хэнк. Чтобы ваш QMainWindow
получал события из QGraphicsScene
вам необходимо установить фильтр событий (см. Http://qt-project.org/doc/qt-4.8/qobject.html#installEventFilter). Цитата из DOC:
An event filter is an object that receives all events that are sent to this object.
The filter can either stop the event or forward it to this object.
Для обработки событий вам необходимо определить метод eventFilter
в вашем классе основного окна. Ниже приведены on_pushButton_clicked()
и eventFilter()
которые должны делать то, что вы хотите:
void MainWindow::on_pushButton_clicked()
{
ui->graphicsView->setMouseTracking(true);
scene->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::GraphicsSceneMouseMove ) {
QGraphicsSceneMouseEvent *mouseEvent = static_cast<QGraphicsSceneMouseEvent*>(event);
QPointF img_coord_pt = mouseEvent->scenePos();
double x = img_coord_pt.x();
double y = img_coord_pt.y();
QColor color = QColor(pix.toImage().pixel(x,y));
int average = (color.red()+color.green()+color.blue())/3;
ui->label_X->setText(QString::number(x));
ui->label_Y->setText(QString::number(y));
ui->label_Value->setText(QString::number(average));
return true;
} else {
return QObject::eventFilter(obj, event);
}
}
Помогает ли это?