QGraphicsView class crashes the application
-
Hi,
I created a class and promoted my QGraphicsView to the class. But the application crashes.When its executed. I am not sure whats the problem behind it.My code
@
#STATIONARY IMAGE VIEWER.CPP
#include "stationaryimageviewer.h"
#include"QtGui"
#include"QFileInfo"
#include"QVariant"
#include"QString"StationaryImageViewer::StationaryImageViewer(QWidget *parent) :
QGraphicsView(parent)
{}
void StationaryImageViewer::setStationaryImage_()
{StationaryImageQListItem_ = listWidgetViewerObject.currentItem(); QVariant StationaryImageData_=StationaryImageQListItem_->data(Qt::UserRole); QString StationaryData_=StationaryImageData_.toString(); QFileInfo StationaryImageInfo_(StationaryData_); StationaryImageFilePath_= StationaryImageInfo_.absoluteFilePath(); StationaryImagePixmap_.load(StationaryImageFilePath_); StationaryImageViewItem_->setPixmap(StationaryImagePixmap_); StationaryImageScene_->addItem(StationaryImageViewItem_); fitInView(StationaryImageScene_->itemsBoundingRect(),Qt::IgnoreAspectRatio); setScene(StationaryImageScene_); show(); update();
}
@
#STATIONARY IMAGE VIEWER.H
@
#ifndef STATIONARYIMAGEVIEWER_H
#define STATIONARYIMAGEVIEWER_H#include <QWidget>
#include<QGraphicsView>
#include<QPixmap>
#include<QGraphicsPixmapItem>
#include"listWidget.h"
#include<QListWidget>
class QWidget;class StationaryImageViewer : public QGraphicsView
{
Q_OBJECT
public:
explicit StationaryImageViewer(QWidget *parent = 0);QGraphicsScene *StationaryImageScene_=new QGraphicsScene(); QGraphicsPixmapItem *StationaryImageViewItem_=new QGraphicsPixmapItem(); QListWidgetItem *StationaryImageQListItem_=new QListWidgetItem(); QPixmap StationaryImagePixmap_; QString StationaryImageFilePath_; listWidget listWidgetViewerObject;
signals:
public slots:
void setStationaryImage_();};
#endif // STATIONARYIMAGEVIEWER_H
@
#IMAGEREGISTRATION IMPLEMENTATION.H
@
ImageRegistration::ImageRegistration(QWidget *parent) :
QWidget(parent),
ui(new Ui::ImageRegistration)
{ui->setupUi(this); ui->ExportTransformationMatrix->setStyleSheet("border-style:inset"); ui->ExportTransformationMatrix->setStyleSheet("border-width: 2px"); ui->ManualRegistrationView->setStyleSheet(" border: 2px solid rgb(130,170,245)"); ui->StationaryImageView->setStyleSheet(" border: 2px solid rgb(130,170,245)"); ui->MovingImageView->setStyleSheet("border: 2px solid rgb(130,170,245)"); ui->ZoomImage->setStyleSheet("border: 2px solid black "); connect(ui->ZoomImage,SIGNAL(valueChanged(int)),this,SLOT(updateTransform())); connect(ui->RotateImage,SIGNAL(valueChanged(int)),this,SLOT(updateTransform())); connect(ui->ImportImages,SIGNAL(clicked()),&listObject_, SLOT(setData_())); listObject_.show(); connect(ui->ImageList,SIGNAL(itemDoubleClicked(QListWidgetItem*)),&StationaryImageObject_,SLOT(setStationaryImage_())); StationaryImageObject_.show();
}
@
I am trying to figure out my mistake. Would be helpful to have some suggestions. -
and where does it crash?
-
i asked "where" not "when".
Start your application with a debugger (e.g. QtCreator in debug mode) and it will show you the position in the code. -
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 com.yourcompany.ImageRegistration 0x0000000100056b3a StationaryImageViewer::setStationaryImage_() + 42 (stationaryimageviewer.cpp:18)
1 com.yourcompany.ImageRegistration 0x0000000100058052 StationaryImageViewer::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) + 130 (moc_stationaryimageviewer.cpp:48)
2 QtCore 0x0000000101b8d09e QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 1566
3 QtGui 0x000000010134c3b1 QListWidget::itemDoubleClicked(QListWidgetItem*) + 49
4 QtCore 0x0000000101b8d09e QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 1566
5 QtGui 0x00000001012d90e9 QAbstractItemView::doubleClicked(QModelIndex const&) + 41
6 QtGui 0x00000001012db205 QAbstractItemView::mouseDoubleClickEvent(QMouseEvent*) + 277
7 QtGui 0x0000000100e34481 QWidget::event(QEvent*) + 2449
8 QtGui 0x00000001011c60ac QFrame::event(QEvent*) + 44
9 QtGui 0x00000001012526e7 QAbstractScrollArea::viewportEvent(QEvent*) + 23
10 QtGui 0x00000001012e78cb QAbstractItemView::viewportEvent(QEvent*) + 427
11 QtGui 0x0000000101254a70 QAbstractScrollAreaFilter::eventFilter(QObject*, QEvent*) + 48
12 QtCore 0x0000000101b74687 QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject*, QEvent*) + 151
13 QtGui 0x0000000100dd95be QApplicationPrivate::notify_helper(QObject*, QEvent*) + 142
14 QtGui 0x0000000100de0190 QApplication::notify(QObject*, QEvent*) + 2384
15 QtCore 0x0000000101b74bdc QCoreApplication::notifyInternal(QObject*, QEvent*) + 124
16 QtGui 0x0000000100dddbdd QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) + 333
17 QtGui 0x0000000100d8d6cb qt_mac_handleMouseEvent(NSEvent*, QEvent::Type, Qt::MouseButton, QWidget*, bool) + 763
18 com.apple.AppKit 0x00007fff8b01c50e -[NSWindow sendEvent:] + 6853
19 QtGui 0x0000000100d827d7 -[QCocoaWindow sendEvent:] + 87
20 com.apple.AppKit 0x00007fff8b018644 -[NSApplication sendEvent:] + 5761
21 QtGui 0x0000000100d87814 -[QNSApplication sendEvent:] + 84
22 com.apple.AppKit 0x00007fff8af2e21a -[NSApplication run] + 636
23 QtGui 0x0000000100d92680 QEventDispatcherMac::processEvents(QFlagsQEventLoop::ProcessEventsFlag) + 1824
24 QtCore 0x0000000101b73af4 QEventLoop::processEvents(QFlagsQEventLoop::ProcessEventsFlag) + 68
25 QtCore 0x0000000101b73ea4 QEventLoop::exec(QFlagsQEventLoop::ProcessEventsFlag) + 324
26 QtCore 0x0000000101b7658c QCoreApplication::exec() + 188
27 com.yourcompany.ImageRegistration 0x0000000100002375 main + 101 (main.cpp:12)
28 com.yourcompany.ImageRegistration 0x00000001000022cd _start + 203
29 com.yourcompany.ImageRegistration 0x0000000100002201 start + 33Thread 1:
0 libsystem_kernel.dylib 0x00007fff92e3d6d6 __workq_kernreturn + 10
1 libsystem_c.dylib 0x00007fff8a7c5f1c _pthread_workq_return + 25
2 libsystem_c.dylib 0x00007fff8a7c5ce3 _pthread_wqthread + 412
3 libsystem_c.dylib 0x00007fff8a7b0191 start_wqthread + 13Thread 2:: Dispatch queue: com.apple.libdispatch-manager
0 libsystem_kernel.dylib 0x00007fff92e3dd16 kevent + 10
1 libdispatch.dylib 0x00007fff93c60dea _dispatch_mgr_invoke + 883
2 libdispatch.dylib 0x00007fff93c609ee _dispatch_mgr_thread + 54Thread 3:
0 libsystem_kernel.dylib 0x00007fff92e3d6d6 __workq_kernreturn + 10
1 libsystem_c.dylib 0x00007fff8a7c5f1c _pthread_workq_return + 25
2 libsystem_c.dylib 0x00007fff8a7c5ce3 _pthread_wqthread + 412
3 libsystem_c.dylib 0x00007fff8a7b0191 start_wqthread + 13Thread 4:
0 libsystem_kernel.dylib 0x00007fff92e3d6d6 __workq_kernreturn + 10
1 libsystem_c.dylib 0x00007fff8a7c5f1c _pthread_workq_return + 25
2 libsystem_c.dylib 0x00007fff8a7c5ce3 _pthread_wqthread + 412
3 libsystem_c.dylib 0x00007fff8a7b0191 start_wqthread + 13Thread 5:
0 libsystem_kernel.dylib 0x00007fff92e3d6d6 __workq_kernreturn + 10
1 libsystem_c.dylib 0x00007fff8a7c5f1c _pthread_workq_return + 25
2 libsystem_c.dylib 0x00007fff8a7c5ce3 _pthread_wqthread + 412
3 libsystem_c.dylib 0x00007fff8a7b0191 start_wqthread + 13Thread 6:
0 libsystem_kernel.dylib 0x00007fff92e3d6d6 __workq_kernreturn + 10
1 libsystem_c.dylib 0x00007fff8a7c5f1c _pthread_workq_return + 25
2 libsystem_c.dylib 0x00007fff8a7c5ce3 _pthread_wqthread + 412
3 libsystem_c.dylib 0x00007fff8a7b0191 start_wqthread + 13Thread 7:
0 libsystem_kernel.dylib 0x00007fff92e3d6d6 __workq_kernreturn + 10
1 libsystem_c.dylib 0x00007fff8a7c5f1c _pthread_workq_return + 25
2 libsystem_c.dylib 0x00007fff8a7c5ce3 _pthread_wqthread + 412
3 libsystem_c.dylib 0x00007fff8a7b0191 start_wqthread + 13 -
I have posted the implementation again for clarity in lines
@
#include "stationaryimageviewer.h"
#include"QtGui"
#include"QFileInfo"
#include"QVariant"
#include"QString"StationaryImageViewer::StationaryImageViewer(QWidget *parent) :
QGraphicsView(parent)
{}
void StationaryImageViewer::setStationaryImage_()
{StationaryImageQListItem_ =listWidgetViewerObject.currentItem(); QVariant StationaryImageData_=StationaryImageQListItem_->data(Qt::UserRole); QString StationaryData_=StationaryImageData_.toString(); QFileInfo StationaryImageInfo_(StationaryData_); StationaryImageFilePath_= StationaryImageInfo_.absoluteFilePath(); StationaryImagePixmap_.load(StationaryImageFilePath_); StationaryImageViewItem_->setPixmap(StationaryImagePixmap_); StationaryImageScene_->addItem(StationaryImageViewItem_); fitInView(StationaryImageScene_->itemsBoundingRect(),Qt::IgnoreAspectRatio); setScene(StationaryImageScene_); show(); update();
}
@ -
where is this variable initialized? StationaryImageObject_
-
Hi,
Are you sure StationaryImageQListItem_ is valid ?
-
Hi,
I have used an object created from a class listWidget@
listWidget listWidgetViewerObject;
@to get the current item of the listWidget using
@
StationaryImageQListItem_ =listWidgetViewerObject.currentItem();
@
and used it in QVariant. I don't understand what's going wrong here
-
Again, are you sure that StationaryImageQListItem_ is pointing to a valid item ?
-
I tried to reimplement it in another way as
listWidget.cpp
@
QString listWidget::ConvertMovingData_()
{
QVariant MovingImageData_=item(currentRow()+1)->data(Qt::UserRole);
QString MovingData_=MovingImageData_.toString();
QFileInfo MovingImageInfo_(MovingData_);
QString MovingImageFilePath_= MovingImageInfo_.absoluteFilePath();
return MovingImageFilePath_;}
QString listWidget::ConvertStationaryData_()
{
QVariant StationaryImageData_=currentItem()->data(Qt::UserRole);
QString StationaryData_=StationaryImageData_.toString();
QFileInfo StationaryImageInfo_(StationaryData_);
QString StationaryImageFilePath_= StationaryImageInfo_.absoluteFilePath();
return StationaryImageFilePath_;}
@
listWidget.h
@
public slots:
QString ConvertMovingData_();
QString ConvertStationaryData_();
@And i used it in
movingimageviewer.cpp
@
void MovingImageViewer::setMovingImage_()
{
MovingImageScene_->removeItem(MovingImageViewItem_);
MovingImageScene_->clear();
QString MovingStringData=listWidgetMovingViewerObject.ConvertMovingData_();
MovingImagePixmap_.load(MovingStringData);
MovingImageViewItem_->setPixmap(MovingImagePixmap_);
MovingImageScene_->addItem(MovingImageViewItem_);
fitInView(MovingImageScene_->itemsBoundingRect(),Qt::IgnoreAspectRatio);
setScene(MovingImageScene_);
show();
update();
}
@similarly in
@
void StationaryImageViewer::setStationaryImage_()
{StationaryImageScene_->removeItem(StationaryImageViewItem_); StationaryImageScene_->clear(); QString StationaryStringData= listWidgetStationaryObject.ConvertStationaryData_(); StationaryImagePixmap_.load(StationaryStringData); StationaryImageViewItem_->setPixmap(StationaryImagePixmap_); StationaryImageScene_->addItem(StationaryImageViewItem_); fitInView(StationaryImageScene_->itemsBoundingRect(),Qt::IgnoreAspectRatio); setScene(StationaryImageScene_); show(); update();
}
@
-
This is the crash report for this implementation
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 com.yourcompany.ImageRegistration 0x0000000100055d4f listWidget::ConvertStationaryData_() + 31 (listWidget.cpp:58)
1 com.yourcompany.ImageRegistration 0x0000000100056a44 StationaryImageViewer::setStationaryImage_() + 68 (stationaryimageviewer.cpp:21)which again corresponds to the @QVariant@ implementation
-
You still don't check whether the return value of currentItem() is valid
-
Just test if the pointer is null