[gelöst] QTableView liefert kein doubleClicked()

Alles rund um die Programmierung mit Qt
Antworten
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

[gelöst] QTableView liefert kein doubleClicked()

Beitrag von Willi2793 »

Ich habe eine QTableView mit Modeel und möchte gerne ein Detail-Fenster zu einer Zeile zeigen wenn eine Zeile doppelt geklickt wurde. Dazu habe ich doubleClicked(QModelIndex) connected. Zum Test auch clicked(QModelIndex). clicked wird aufgerufen, doubleClicked aber leider nicht. Müssen dafür Vorkehrungen getroffen werden?

Grüße,
Willi
Zuletzt geändert von Willi2793 am 23. November 2010 23:03, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Nein. Code? Fehlermeldungen, oder Meldungen auf der Konsole?
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

Fehlermeldungen und Meldungen auf der Konsole Fehlanzeige. Einen Codeschnipsel muss ich erst mal vorbereiten. Ich dachte das eventuell eine Voraussetzung fehlt. Jetzt muß ich ihn halt erst klein machen ;)

Aber schonmal danke für die Antwort. :)
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Re: QTableView liefert kein doubleClicked()

Beitrag von padreigh »

Willi2793 hat geschrieben: Müssen dafür Vorkehrungen getroffen werden?
Doppelt klicken?

SCNR

Eigentlich sollte das gehen. Hast du eventuell EventHandler oder mouseclicked überladen so dass die dir den Doppelklick "stehlen"? Hier geht das Problemlos.
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Re: QTableView liefert kein doubleClicked()

Beitrag von Willi2793 »

padreigh hat geschrieben:Doppelt klicken?
Der war gut und ich habe ihn verdient :wink:
padreigh hat geschrieben:Eigentlich sollte das gehen. Hast du eventuell EventHandler oder mouseclicked überladen so dass die dir den Doppelklick "stehlen"? Hier geht das Problemlos.
Als Ebenthandler habe ich nur den CloseEvent am Window. Und der einfache Click wird ja auch geliefert.
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

So, nun habe ich ein kleines Beispiel gemacht bei dem das auch nicht funktioniert. Ich hoffe jemand kann mich erleuchten :)

main.cpp

Code: Alles auswählen

#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

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "modelclass.h"

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    ModelClass model;

private slots:
    void doubleClicked(QModelIndex);
};

#endif // MAINWINDOW_H
mainwindow.cpp

Code: Alles auswählen

#include <QDebug>
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    model() {

    ui->setupUi(this);
    ui->tableView->setModel(&model);

    connect(ui->tableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(doubleClicked(QModelIndex)));

}

MainWindow::~MainWindow() {
    delete ui;
}

void MainWindow::doubleClicked(QModelIndex index) {
    qDebug() << "Es wurde doppelt geklickt: " << index;
}
mainwindow.ui

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QTableView" name="tableView"/>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>400</width>
     <height>18</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>
modelclass.h

Code: Alles auswählen

#ifndef MODELCLASS_H
#define MODELCLASS_H

#include <QAbstractTableModel>
#include <QStringList>

class ModelClass : public QAbstractTableModel
{
public:
    ModelClass();
    virtual ~ModelClass();
    virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
    virtual Qt::ItemFlags flags(const QModelIndex& index) const;
    virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
    virtual int columnCount(const QModelIndex& parent = QModelIndex()) const;
    virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
    virtual bool setData(const QModelIndex& index, const QVariant& value, int role);

private:
    QStringList cont;
};

#endif // MODELCLASS_H
modelclass.cpp

Code: Alles auswählen

#include <QAbstractTableModel>
#include <QStringList>
#include "modelclass.h"

ModelClass::ModelClass() :
    cont() {

    cont.append("Line 1");
    cont.append("Line 2");
    cont.append("Line 3");
    cont.append("Line 4");
    cont.append("Line 5");

}

ModelClass::~ModelClass() {
}

QVariant ModelClass::headerData(int section, Qt::Orientation orientation, int role) const {
    QVariant xReturn;
    switch(orientation) {
    case Qt::Vertical:
        switch(role) {
        case Qt::DisplayRole:
            xReturn = QString().setNum(section+1);
            break;
        default:
            break;
        }
        break;
    default:
        break;
    }
    return xReturn;
}

Qt::ItemFlags ModelClass::flags(const QModelIndex& index) const {
    return Qt::ItemFlags();
}

int ModelClass::rowCount(const QModelIndex& parent) const {
    int cnt = 0;
    if (!parent.isValid()) {
        cnt = cont.size();
    }
    return cnt;
}

int ModelClass::columnCount(const QModelIndex& parent) const {
    int nCount = 0;
    if (!parent.isValid()) {
        nCount = 1;
    }
    return nCount;
}

QVariant ModelClass::data(const QModelIndex& index, int role) const {
    QVariant xReturn;
    if (index.row() < cont.size()) {
        switch(role) {
        case Qt::DisplayRole:
        case Qt::EditRole:
            switch(index.column()) {
            case 0:
                xReturn = cont.at(index.row());
                break;
            default:
                break;
            }
            break;
        default:
            break;
        }
    }
    return xReturn;
}

bool ModelClass::setData(const QModelIndex& index, const QVariant& value, int role) {
    return true;
}
Zuletzt geändert von Willi2793 am 23. November 2010 23:00, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Das Beispiel ist wegen dem nicht mitgelieferten ui nicht kompilierbar. Für ein Minimalbeispiel tut es auch ein einfaches manuelles QTableView anlegen + als centralWidget setzen.
Dann zum Fehler:

Code: Alles auswählen

Qt::ItemFlags ModelClass::flags(const QModelIndex& index) const {
    return Qt::ItemFlags();
}
Lass die Methode einfach weg, wenn du nicht weißt was du damit anfangen sollst. Oder implementier die richtig. Ich hab es auskommentiert und schon bekomm ich Consolenausgaben, die vor der Änderung natürlich NICHT kamen.
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

franzf hat geschrieben:Das Beispiel ist wegen dem nicht mitgelieferten ui nicht kompilierbar. Für ein Minimalbeispiel tut es auch ein einfaches manuelles QTableView anlegen + als centralWidget setzen.
Stimmt, sorry. Ich habe es der Vollständigkeit halber nachgetragen.
franzf hat geschrieben:Dann zum Fehler:

Code: Alles auswählen

Qt::ItemFlags ModelClass::flags(const QModelIndex& index) const {
    return Qt::ItemFlags();
}
Lass die Methode einfach weg, wenn du nicht weißt was du damit anfangen sollst. Oder implementier die richtig. Ich hab es auskommentiert und schon bekomm ich Consolenausgaben, die vor der Änderung natürlich NICHT kamen.
Danke, das war es wirklich.
Antworten