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.


  • Moderators

    and where does it crash?



  • When i double click the image list item


  • Moderators

    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 + 33

    Thread 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 + 13

    Thread 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 + 54

    Thread 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 + 13

    Thread 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 + 13

    Thread 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 + 13

    Thread 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 + 13

    Thread 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();
    

    }
    @


  • Moderators

    where is this variable initialized? StationaryImageObject_



  • Its initialised at the header in ImageRegistrationImplementation.h

    @

    private:

    listWidget listObject_;
    StationaryImageViewer StationaryImageObject_;
    MovingImageViewer MovingImageObject_;

    @



  • I could understand the program crashes at the line

    @

    QVariant StationaryImageData_=StationaryImageQListItem_->data(Qt::UserRole);

    @

    But i don't know why


  • Lifetime Qt Champion

    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


  • Lifetime Qt Champion

    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


  • Lifetime Qt Champion

    You still don't check whether the return value of currentItem() is valid



  • Hi,

    How can I check whether it is valid ?? I thought it should be valid, as I am just taking the data of the item which is clicked in listWidget. Is there a way to check In Qt, like catching an exception ? Or error


  • Lifetime Qt Champion

    Just test if the pointer is null


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.