Seite 1 von 1

Programm stürtzt bei Item Zugriff ab!

Verfasst: 13. Juli 2011 18:40
von Marvvvv
Hi,
ich verwende ein TreeView mit einem SortFilterProxyModel und habe als Daten model ein StandardItemModel und ich habe ein Click-Event auf das TreeView registriert.
Das ganze sieht wie folgt aus:

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{

    table = new QTreeView(this);
    model = new QStandardItemModel(0, 4,this);
    proxyModel = new QSortFilterProxyModel(this);
    add_button->setText(tr("Kontakt hinzufügen"));

    proxyModel->setDynamicSortFilter(true);

    connect(table, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(on_itemDoubleClicked(QModelIndex)));

    model->setHeaderData(0, Qt::Horizontal, QObject::tr("Index"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Bla 1"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("Bla 2"));
    model->setHeaderData(3, Qt::Horizontal, QObject::tr("Bla 3"));

     model->insertRow(0);
     model->setData(model->index(0, 0), QString::number(0));
     model->setData(model->index(0, 1), tr("bla"));
     model->setData(model->index(0, 2), tr("bla"));
     model->setData(model->index(0, 3), tr("bla"));
     model->insertRow(0);
     model->setData(model->index(0, 0), QString::number(1));
     model->setData(model->index(0, 1), tr("bla"));
     model->setData(model->index(0, 2), tr("bla"));
     model->setData(model->index(0, 3), tr("bla"));
    
    proxyModel->setSourceModel(model);
    proxyModel->setFilterKeyColumn(-1);

    table->setModel(proxyModel);
    table->setEditTriggers(QAbstractItemView::NoEditTriggers);
    table->setSortingEnabled(true);
    table->setAcceptDrops(false);
    table->setColumnHidden(0,true);
    table->setContentsMargins(2,2,2,2);
}
void MainWindow::on_itemDoubleClicked(const QModelIndex & index) {
    QStandardItem* item = model->itemFromIndex(index);
    QMessageBox::warning(this,"",QString::number(item->row()));
}
Sobald ich einen Doppelklick mache stürzt das Programm ab!
Ich habe keine Ahnung woran es liegt.

Verfasst: 13. Juli 2011 19:07
von Christian81
Man nehme einen Debugger und schau wo und warum er abstürzt...

Verfasst: 13. Juli 2011 19:25
von Marvvvv
Wenn ich den Debugger verwende steht dort:
Angehalten: "end-stepping-range"
Aber das hilft mir nicht weiter :(
In der Zeile:

Code: Alles auswählen

QStandardItem* item = model->itemFromIndex(index);

Verfasst: 13. Juli 2011 19:31
von Christian81
Da sollte man mal schauen ob der Pointer auch initialisiert ist.
Und wenn wir es testen sollen - dann ein minimales Beispiel mit dem Crash.

Verfasst: 13. Juli 2011 19:51
von Marvvvv
Hier ein Minimal Projekt:

Code: Alles auswählen

//
// Main.cpp
//
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

//
// MainWindow.h
//
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStandardItemModel>
#include <QSortFilterProxyModel>
#include <QTreeView>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QSortFilterProxyModel* proxyModel;
    QStandardItemModel *model;
    QTreeView* table;
private slots:
    void on_itemDoubleClicked(const QModelIndex & index);
};

#endif // MAINWINDOW_H

//
// MainWindow.cpp
//

#include "mainwindow.h"
#include <QTreeView>
#include <QMessageBox>
#include <QGridLayout>
#include <QLabel>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QLabel* label = new QLabel();
    QGridLayout* layout = new QGridLayout(this);
    table = new QTreeView(this);
    model = new QStandardItemModel(0, 3,this);
    proxyModel = new QSortFilterProxyModel;
    proxyModel->setDynamicSortFilter(true);

    model->setHeaderData(0, Qt::Horizontal, QObject::tr("Subject"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Sender"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("Date"));
    model->insertRow(0);
    model->setData(model->index(0, 0), tr("Test"));
    model->setData(model->index(0, 1), tr("Test"));
    model->setData(model->index(0, 2), tr("Test"));
    model->insertRow(0);
    model->setData(model->index(0, 0), tr("Test2"));
    model->setData(model->index(0, 1), tr("Bla"));
    model->setData(model->index(0, 2), tr("Test2"));

    proxyModel->setSourceModel(model);
    proxyModel->setFilterKeyColumn(-1);
    table->setModel(proxyModel);

    connect(table, SIGNAL(doubleClicked(QModelIndex)),this,SLOT(on_itemDoubleClicked(QModelIndex)));

    layout->addWidget(table);
    setCentralWidget(label);
    centralWidget()->setLayout(layout);
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_itemDoubleClicked(const QModelIndex & index) {
    QStandardItem* item;
    item = model->itemFromIndex(index);
    QMessageBox::warning(this,"",QString::number(item->row()));
}

Verfasst: 13. Juli 2011 20:43
von Christian81
Und wo stürzzt es ab? Sicher nicht bei "item = model->itemFromIndex(index);" sondern eine Zeile später nämlich wenn item NULL ist was immer der Fall sein sollte.

Verfasst: 13. Juli 2011 20:54
von Marvvvv
Wieso sollte das immer der Fall sein?
Nein sicher bin ich mir nicht. Er Stoppt an dieser Zeile das kann ja auch gut heißen das er die nächste nicht Ausführt..

Verfasst: 13. Juli 2011 21:00
von Christian81
Na wenn Du meinst ... :roll:
Wenn man keine QStandardItems erzeugt - wie sollte die Funktion dann QStandardItems zurückgeben??

Verfasst: 13. Juli 2011 21:11
von Marvvvv
Ich habe gedacht das QStandardItemModel erzeugt intern welche, bei folgendem Code:

Code: Alles auswählen

    model->insertRow(0); 
    model->setData(model->index(0, 0), tr("Test")); 
    model->setData(model->index(0, 1), tr("Test")); 
    model->setData(model->index(0, 2), tr("Test")); 
    model->insertRow(0); 
    model->setData(model->index(0, 0), tr("Test2")); 
    model->setData(model->index(0, 1), tr("Bla")); 
    model->setData(model->index(0, 2), tr("Test2")); 
Aber wenn das nicht der Fall ist wie kann ich dann auf das Item zugreifen auf das geklickt wurde?

Verfasst: 13. Juli 2011 21:12
von Christian81
Das Gegenteil von setData() ist data() -> Doku

Verfasst: 13. Juli 2011 21:35
von Marvvvv
Ahh ok danke =)
Jetzt 2 neue Fragen.
Also mit diesem QVariant komme ich nicht so ganze klar. Und zwar erfolg folgendes ein leeres Resultat:

Code: Alles auswählen

void MainWindow::on_itemDoubleClicked(const QModelIndex & index) {
    QVariant item;
    item = model->data(index, Qt::DisplayRole);
    QMessageBox::warning(this,"",item.typeName());
}
Und wenn ich es die Daten via insertRow() zu meinem model hinzufüge klappt das QSortFilterProxyModel() dann noch, oder greif es auf data() zu wie ich es denke?

Verfasst: 13. Juli 2011 21:51
von Christian81
Steht alles hier: http://doc.trolltech.com/4.7/qsortfilte ... ml#details
The QSortFilterProxyModel acts as a wrapper for the original model. If you need to convert source QModelIndexes to sorted/filtered model indexes or vice versa, use mapToSource(), mapFromSource(), mapSelectionToSource(), and mapSelectionFromSource().