2013-08-28 3 views
1

Я пытаюсь создать Dicom GUI Toolkit, где пользователь выбирает некоторые изображения dicom, и будет показано изображение первого изображения dicom из выбранных. Затем пользователь нажимает на изображение, и изображение появляется с большим окном изображения. На этом увеличенном изображении изображение будет состоять из красного прямоугольника, который содержит необходимые области изображения Dicom, в то время как ненужная область находится за пределами прямоугольника. Затем пользователь должен иметь возможность изменить прямоугольник мышью.Интерактивное редактирование существующего прямоугольника на QPixmap?

До сих пор я смог показать большое изображение dicom с прямоугольником в нем, используя QLabel, который по нижеследующим фрагментам кода.

void MainWindow::showBigImage() 
{ 
    QPixmap bigimage; 
    bigimage.load(imageName.c_str()); 
    QPainter painter(&bigimage); 
    painter.setPen(Qt::red); 
    QRectF rect(xmin, ymin, xmax, ymax); 
    painter.drawRect(rect); 
    QSize bigsize = ui->bigImageLabel->size(); 
    ui->bigImageLabel->setPixmap(bigimage.scaled(bigsize, Qt::IgnoreAspectRatio, Qt::FastTransformation)); 
    ui->bigImageLabel->show(); 
} 

и большое изображение на приложении выглядит следующим образом:

enter image description here

Можете ли вы предложить мне, как я должен теперь сделать прямоугольник редактируемого пользователем, в котором пользователь может установить существующий красный прямоугольник согласно его или ее желанию?

Я также попробовал нечто подобное с помощью QGraphicsView и QGraphicsScene со следующим кодом:

void MainWindow::showBigImage() 
{ 
    QGraphicsScene* scene = new QGraphicsScene; 
    scene->addPixmap(bigimage); 
    ui->bigImageView->setScene(scene); 
    ui->bigImageView->show(); 
} 

И этот код дает мне следующий вид:

enter image description here

Как вы можете видеть, я мог не соответствует изображению до границ QGraphicsView, не могли бы вы предложить мне, как это сделать? Не могли бы вы также предложить мне, как добавить красный прямоугольник (который я показал в примере с помощью QLabel) на QGraphicsView без добавления прямоугольника на QPixmap?

+0

Для установки окна вы можете увидеть: http://stackoverflow.com/questions/9654222/how-to-fit-in-view-the-pixmaps-in-qgraphicsview-qgraphicsscene-without-changing – user2244507

+0

Я действительно видел этот вопрос раньше, я просто не мог понять, как переопределить resizeEvent.Я должен упомянуть, что я новичок в Qt и миллион миль от эффективности на C++. –

ответ

2

Для получения красного прямоугольника выбора Qt предоставляет класс QRubberBand. Состояние документов:

Класс QRubberBand предоставляет прямоугольник или линию, которые могут указывать выделение или границу.

наследования изображения объекта и реализации функций обработки мыши, чтобы создать резинку на mousePressEvent, обновить свою позицию по mouseMoveEvent и захватить его окончательный прямоугольник на mouseReleaseEvent, то QRubberBand упростит задачу.

Если вы хотите, чтобы QRubberBand показывал все время, просто создайте его, когда вы показываете увеличенное изображение и не скрываете его при отпускании кнопки мыши.

Что касается отображения изображения в QGraphicsView, отображаемый код не устанавливает геометрию QGraphicsScene и QGraphicsView, поэтому вы видите границу. Если вы этого не хотите, вы должны установить их соответствующим образом. Также обратите внимание, что QGraphicsView имеет функцию fitInView, которую вы могли бы использовать, после того как вы извлекли область из QRubberBand, чтобы увеличить выделенную область.

+0

Но как насчет красного прямоугольника, который существует еще до того, как пользователь использует любое движение мыши для изменения прямоугольника? Как я могу сделать его редактируемым таким образом, что прямоугольник будет меняться только тогда, когда пользователь коснется его курсором мыши? Возможно ли это сделать с помощью QRubberBand? –

+0

Что вы подразумеваете под «красным прямоугольником, который существует»? У вас уже есть один из другого виджета? – TheDarkKnight

+0

В любом случае мне это удалось :). Нет, я рисовал его на QPixmap, как я показал его на изображении. Но теперь мне это удалось :). Благодарю. Большой совет :). –

Смежные вопросы