我正在编写一个简单的Qt c ++程序来比较两个图像。我已经就项目的设计问了一个问题( Qt Model-View-Controller),但我的教授说我没有必要使用任何qt预定义的模型/视图。
但是现在我在改变图像显示方式时遇到了问题。更确切地说,在我已经加载了两个图像,裁剪它们并完美地显示它们之后,当我试图以不同的方式重新显示裁剪的图像时,我会出现分段错误。这是一些代码:
文件MainWindow.h:
class MainWindow : public QMainWindow, public View, public Controller
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
virtual void myUpdate();
private slots:
void open();
void loadImage();
void zoomIn();
void zoomOut();
void normalSize();
void fitToWindow();
void about();
void vertical();
void horizontal();
private:
Ui::MainWindow *ui;
Image imageComposition;
QImage *result;
QImage* displayVertical(QImage *res, QPainter *painter);
QImage* displayHorizontal(QImage *res, QPainter *painter);
void createActions();
void createMenus();
void updateActions();
void scaleImage(double factor);
void diffImages();
.... // methods and attributes non relevant for this question.
文件MainWindow.cpp:
....//methods non relevant for this question.
void MainWindow::diffImages()
{
// **SIGEGV happening on the following line!!**
result = new QImage(QSize(imageComposition.getLeft()->width(),imageComposition.getLeft()->height()), QImage::Format_ARGB32_Premultiplied);
ui->Canvas->resize(imageComposition.getLeft()->width(),imageComposition.getLeft()->height());
QPainter *painter = new QPainter(result);
switch(imageComposition.getDivisionBar()) {
case 0 :
result = displayVertical(result, painter);
break;
case 1 :
result = displayHorizontal(result, painter);
break;
};
ui->Canvas->setPixmap(QPixmap::fromImage(*result));
}
.....
QImage* MainWindow::displayVertical(QImage *res, QPainter *painter)
{
QRect leftRect(QPoint(0,0), QPoint(imageComposition.getLeft()->width()/2,imageComposition.getLeft()->height() - 1 ));
QImage leftSide(imageComposition.getLeft()->copy(leftRect));
QRect rightRect(QPoint(imageComposition.getRight()->width()/2, 0), QPoint(imageComposition.getRight()->width() - 1,imageComposition.getRight()->height() - 1));
QImage rightSide(imageComposition.getRight()->copy(rightRect));
painter->drawImage(0,0, leftSide);
painter->drawImage(res->width()/2, 0, rightSide);
return res;
}
QImage *MainWindow::displayHorizontal(QImage *res, QPainter *painter) {
QRect upperRect(QPoint(0,0), QPoint(imageComposition.getLeft()->width() - 1, imageComposition.getLeft()->height() / 2));
QImage upperSide(imageComposition.getLeft()->copy(upperRect));
QRect lowerRect(QPoint(0,imageComposition.getRight()->height() / 2), QPoint(imageComposition.getRight()->width() - 1, imageComposition.getRight()->height() - 1));
QImage lowerSide(imageComposition.getRight()->copy(lowerRect));
painter->drawImage(0, 0, upperSide);
painter->drawImage(0, res->height() / 2, lowerSide);
return res;
}
所以分段错误发生在diffImages()中,在第一行,当结果(一个QImage已经包含某些东西,因为它是第一次初始化两个图像时)。应该重新初始化以显示图像其他方式。也就是用户按下按钮"水平显示"。
我在网上搜索了一些建议把画家 - > gt; drawImage()包含在diffImages()函数中,在MainWindow :: paintEvent(QPaintEvent *)的重载实现中。但是这样就可以在需要重绘某些东西时调用diffImages(),包括初始窗口显示,这会导致循环的redraw()调用。所以我决定不遵循这个建议。
根据我的理解,问题的可能原因可能是,当调用的方法想要重新初始化时,结果仍然显示在QLabel内的屏幕上。你有什么建议?提前谢谢。
P.S。我试图尽可能清楚,但如果您需要完整的来源或其他解释,请告诉我。