我有一个GUI,该GUI由具有18列的QTableView和一个QGraphicsView组成,在其中使用按钮上传图像。我能够在感兴趣的区域(ROI)上绘制一个框,并在使用鼠标右键单击后立即打开一个小对话框。该对话框由具有两个页面的TabWidget组成。第一页有一个小的QGraphicsView,它带有在绘制上一个框时捕获的裁剪图像(例如Image A)。 TabWidget的第二页还具有另一个QGraphicsView,我可以使用它上载以前保存在桌面上的.jpg图像(例如图像B)。一旦我确定,该对话框上的信息将被传输到QTableView的第一行。图像A将存储在一个列中(精确到第17列),图像B也将存储在另一列中(精确地在第18列)。
我能够在QTableView中存储裁剪后的图像A(这是最困难的部分,因为我必须努力理解Qt和openCV之间的转换格式,反之亦然),而不是图像B(我处理起来很简单)我保存在桌面上的图片。
我尝试了其他选项:选项1:我创建了一个函数,用于处理在TabWidget第二页上上传的图像(图像B),选项2:< / strong>我尝试调试以缩小问题范围,并且似乎编译器没有看到我要存储的图像。
我要附加代码中最重要的部分,以解决此错误:
在 clipscene.h 中,我声明了我使用的最重要的变量和函数:
class clipScene : public QDialog
{
Q_OBJECT
public:
explicit clipScene(QWidget *parent = 0);
~clipScene();
void setImage(QImage img);
void setClassifiedImage(QImage img);
SelectionData getData();
void setData(SelectionData newdata);
private:
SelectionData returnData;
Ui::clipScene *ui;
QImage simg;
QImage featureClassified;
};
在 clipscene.cpp 中,这是我用来处理图片B的功能setClassifiedImage
void clipScene::setClassifiedImage(QImage img)
{
featureClassified = img;
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(featureClassified));
workingImageScene->addItem(item);
}
使用setImage
在 clipscene.cpp 中,我成功处理了裁剪图像的Qt和openCV转换
void clipScene::setImage(QImage img)
{
simg = img;
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(simg));
scene->addItem(item);
ui->graphicsViewClipped->show();
cv::Mat input = cv::Mat(simg.height(), simg.width(), CV_16UC3, simg.bits(), simg.bytesPerLine());
// .....operations...
// .....operations...
}
在 clipscene.cpp 中,以下img1
代表裁剪的图像A,而img2
代表图像B(当前未存储或未存储均未通过)
void clipScene::on_acceptBtn_clicked()
{
// .....operations...
// This will save the cropped Image A successfully
QPixmap img1;
img1.convertFromImage(simg);
QByteArray img1Array;
QBuffer buffer1(&img1Array);
buffer1.open(QIODevice::WriteOnly);
img1.save(&buffer1, "PNG");
returnData.mSave = img1Array;
// This will save a different Image B
// But here the compiler says that no arguments are being passed
QPixmap img2;
QByteArray img2Array;
QBuffer buffer2(&img2Array);
buffer2.open(QIODevice::WriteOnly);
img2.save(&buffer2, "PNG");
returnData.mClassImg = img2Array;
}
最后,当所有信息都传递并存储在QTableView上时,我可以双击QTableView的一行,而之前用于手动存储数据的对话框将弹出,其中记录了所有信息和两个图像(图像A和图片B)。 在 MainWindow (以及与错误相关的位置)上执行此操作的代码部分如下:
void MainWindow::onTableClick(const QModelIndex &index)
{
int row = index.row();
SelectionData currentData;
currentData.mName = index.sibling(row, 1).data().toString();
// ....additional data....
// ....additional data...
currentData.mSave = index.sibling(row, 17).data().toByteArray();
currentData.mClassImg = index.sibling(row, 18).data().toByteArray();
QPixmap iconPix;
if(!iconPix.loadFromData(index.sibling(row, 17).data().toByteArray())) {
}
QPixmap iconPix2;
if(!iconPix2.loadFromData(index.sibling(row, 18).data().toByteArray())) {
}
clipScene d(this);
d.setData(currentData);
d.setImage(iconPix.toImage());
d.setClassifiedImage(iconPix2.toImage());
// ....additional operations....
}
几天来我一直在努力解决这个问题,任何可以对此有所了解或提供解决方案的人都将是很棒的。
答案 0 :(得分:0)
我不确定这是否仍然对您有用,但是由于我遇到了同样的问题,这可能会有所帮助。我认为您永远不会将图像传递到目标表。您是否正在加载图像?您是否曾经做过这样的事情:
clipscene.h
private:
QList<QGraphicsPixmapItem*> leftClipPix;
clipscene.cpp
void clipScene::load_classifiedImageFromDb(QImage image)
{
clasImg = image;
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image));
leftClipPix.append(item);
workingImageScene->addItem(item);
ui->yourgraphicsView->show();
ui->yourgraphicsView->setSceneRect(QRectF(0, 0, image.width(), image.height()));
}
而且,正如您所说的,如果您尝试从桌面或数据库上传图像,那么执行以下操作可能会很有用:
void clipScene::load_classifiedImage()
{
QString dir = QFileDialog::getOpenFileName(this, tr("Open image directory"), "", tr("Images (*.tif *.jpg *.png *.jpeg *.bmp *.gif *.tiff)"));
QImage image;
if(QString::compare(dir, QString()) != 0) {
image = QImage(dir);
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image));
leftClipPix.append(item);
workingImageScene->addItem(item);
}
ui->yourgraphicsView->show();
ui->yourgraphicsView->setSceneRect(QRectF(0, 0, image.width(), image.height()));
clasImg = image;
}
并将load_classifiedImage()
函数传递给QPushButton