Есть кастомный QGraphicsView
, в нем отлавливаю эвенты мыши, чтобы скалировать и панарамировать изображение. В QGraphicsScene
лежит кастомный QGraphicsPixmapItem
, в нем, по mousePressEvent
определяется информация о пикселе и испускается сигнал pixelData
, который я хочу отловить главным окном:
void myPixItemX::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if (event->button() != Qt::RightButton) {
QPoint position(event->pos().x(), event->pos().y());
QImage local_image = QImage(qImg_x);
QColor *color = new QColor;
pixel_color = color->fromRgb(local_image.pixel(position));
if (pixel_color.isValid ()) {
pixel_data (position.x (), position.y (), pixel_color.red (), pixel_color.green (), pixel_color.blue ());
}
}
}
Я прочитал, что если переопределять свой QGraphicsItem
, то нужно в конструкторе наследовать сначала от QObject
и вызывать макрос Q_OBJECT
. Сделал так со своим QGraphicsPixmapItem
, вроде ошибок не выдало:
class myPixItemX : public QObject, public QGraphicsPixmapItem
{
Q_OBJECT
public:
myPixItemX(const QPixmap & pixmap, QGraphicsItem * parent = 0);
// Ну и далее по списку, не буду тут все приводить...
Однако, беда пришла оттуда, откуда её совсем не ждешь ...
При попытке соединить в главном окне сигнал моего объекта Pix
с слотом
connect(ui->graphicsView->Pix, SIGNAL(pixel_data(int,int,int,int,int)),this , SLOT(color_pick(int,int,int,int,int)));
, в консоль выдает следующее:
QObject::connect: Cannot connect (null)::pixel_data(int,int,int,int,int) to MainWindow::color_pick(int,int,int,int,int)
Как я понял, на момент создания связки сигнал-слот, объект Pix
еще не был создан, так как он создается после принятия изображения через последовательный порт. Я попытался создать объект Pix при инициализации объекта QGraphicsView
, потом его удалять через scene->clear();
, при приеме изображения и на его место ставить новый. Вот код установки изображения в сцену:
void ImageViewer::setPixmapImage(QByteArray image_data, int image_width, int image_height, int image_resolution)
{
del_grid();
scene->clear();
w_img = image_width;
h_img = image_height;
zoom = 0;
unsigned char data[image_resolution];
memcpy(data, image_data.toStdString().c_str(), image_resolution);
qImg = QImage(data, image_width, image_height, image_width, QImage::Format_Grayscale8);
pixmap = QPixmap::fromImage(qImg);
Pix = new myPixItemX(pixmap);
Pix->setQImg_x (qImg);
scene->addItem(Pix);
scene->setSceneRect(0, 0, pixmap.size().width(), pixmap.size().height());
this->fitInView();
}
Теперь ничто не ругается, однако и сигнал не доходит до главного окна.
И вообще, мне дико не нравиться эта идея с кастомным QGraphicsPixmapItem
, в PyQt5
, можно сделать так:
self._photo = QGraphicsPixmapItem(QPixmap(self.qImg))
self._photo.mousePressEvent = self.pixelSelect
self._scene.addItem(self._photo)
и по клику в пределах QGraphicsPixmapItem
будет вызываться self.pixelSelect
, а можно-ли подобное сделать в Qt
, не создавая лишних классов?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
На странице есть несколько тегов с одинаковым id (так получилось)Как при помощи jQuery удалить последний тег?
Есть первая таблица (ocenka) в которой содержится ид сотрудника и ид его руководителяЕсть вторая таблица (sotr) где содержатся фамилии этих людей