Programm stürtzt bei Item Zugriff ab!

Alles rund um die Programmierung mit Qt
Antworten
Marvvvv
Beiträge: 15
Registriert: 16. Juni 2011 21:15

Programm stürtzt bei Item Zugriff ab!

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Man nehme einen Debugger und schau wo und warum er abstürzt...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Marvvvv
Beiträge: 15
Registriert: 16. Juni 2011 21:15

Beitrag 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);
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Marvvvv
Beiträge: 15
Registriert: 16. Juni 2011 21:15

Beitrag 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()));
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Marvvvv
Beiträge: 15
Registriert: 16. Juni 2011 21:15

Beitrag 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..
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Na wenn Du meinst ... :roll:
Wenn man keine QStandardItems erzeugt - wie sollte die Funktion dann QStandardItems zurückgeben??
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Marvvvv
Beiträge: 15
Registriert: 16. Juni 2011 21:15

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das Gegenteil von setData() ist data() -> Doku
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Marvvvv
Beiträge: 15
Registriert: 16. Juni 2011 21:15

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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().
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten