Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以交互方式编辑QPixmap上的现有矩形?_C++_Qt_Qgraphicsview_Qgraphicsscene_Qlabel - Fatal编程技术网

C++ 以交互方式编辑QPixmap上的现有矩形?

C++ 以交互方式编辑QPixmap上的现有矩形?,c++,qt,qgraphicsview,qgraphicsscene,qlabel,C++,Qt,Qgraphicsview,Qgraphicsscene,Qlabel,我正在尝试创建一个Dicom GUI工具包,用户在其中选择一些Dicom图像,并显示所选图像中的第一个Dicom图像。然后用户点击图像,图像弹出较大的图像窗口。在此显示的较大图像中,图像将由一个红色矩形组成,该矩形包含Dicom图像的必要区域,而不必要区域位于矩形之外。然后,用户应该可以选择通过鼠标更改矩形 到目前为止,我已经能够使用QLabel显示带有矩形的大dicom图像,这是通过以下代码片段实现的 void MainWindow::showBigImage() { QPixmap

我正在尝试创建一个Dicom GUI工具包,用户在其中选择一些Dicom图像,并显示所选图像中的第一个Dicom图像。然后用户点击图像,图像弹出较大的图像窗口。在此显示的较大图像中,图像将由一个红色矩形组成,该矩形包含Dicom图像的必要区域,而不必要区域位于矩形之外。然后,用户应该可以选择通过鼠标更改矩形

到目前为止,我已经能够使用
QLabel
显示带有矩形的大dicom图像,这是通过以下代码片段实现的

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();
}
应用程序上的大图像如下所示:

你能建议我现在应该如何让用户编辑矩形,用户可以根据自己的意愿设置现有的红色矩形吗

我还使用
QGraphicsView
qgraphicscene
使用以下代码尝试了类似的事情:

void MainWindow::showBigImage()
{
    QGraphicsScene* scene = new QGraphicsScene;
    scene->addPixmap(bigimage);
    ui->bigImageView->setScene(scene);
    ui->bigImageView->show();
}
这段代码给了我以下的外观:


正如您所看到的,我无法将图像与
QGraphicsView
的边界相匹配,您能建议我怎么做吗?您还可以建议我如何在
QGraphicsView
上添加红色矩形(我在示例中使用
QLabel
显示),而不在
QPixmap
上添加矩形?

为了获得红色选择矩形,Qt提供了类。文件规定:

QRubberBand类提供了一个矩形或直线,可以指示选择或边界

通过对image对象进行子类化并实现鼠标处理功能,在mousePressEvent上创建橡皮筋,更新其在mouseMoveEvent上的位置,并在mouseReleaseEvent上获取其最终rect,QRubberBand将简化问题

如果您希望QRubberBand始终显示,只需在显示放大图像时创建它,而不要在松开鼠标按钮时隐藏它


至于在QGraphicsView中显示图像,您显示的代码没有设置QGraphicsCenter和QGraphicsView的几何图形,因此您看到的是边框。如果您不希望这样,您应该相应地设置它们。另外请注意,QGraphicsView有一个函数fitInView,您可以在从QRubberBand检索区域后使用该函数放大选定区域。

要适合您可能想要查看的窗口:我之前确实看到过这个问题,我只是不明白如何重新实现resizeEvent。我必须提到我是QT中的新手,离C++有效率有百万英里远。但是,在用户使用鼠标移动来改变矩形之前,红色矩形又是如何存在的呢?如何使其可编辑,使矩形仅在用户用鼠标光标触摸时才会更改?用QRubberBand可以做到吗?你所说的“存在的红色矩形”是什么意思?你已经有了另一个小部件中的一个吗?不管怎样,我管理它:)。不,我是在QPixmap上画的,因为我在图像上显示了它。但现在我成功了:)。谢谢很好的建议:)。你能建议我如何改变QRubberBand的颜色或厚度吗?我见过很多线程,但可以找到解决方案。