Qt:绘制QImage分割错误

时间:2014-08-13 13:23:34

标签: c++ qt segmentation-fault qpainter qimage

我正在编写一个简单的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。我试图尽可能清楚,但如果您需要完整的来源或其他解释,请告诉我。

0 个答案:

没有答案