QTreeView

Alles rund um die Programmierung mit Qt
Antworten
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

QTreeView

Beitrag von DBGTMaster »

Hallo,

habe ein Problem, bzw. einen Schönheitsfehler. Einfach mal den Anhang anschauen...

Warum wird dieser blaue helle Balken nie durchgezogen, sondern immer nur über die erste Spalte??

setColumnCount(2) ist gesetzt, hilft aber nichts :(

was tun?

danke!
Dateianhänge
qe.png
qe.png (7.63 KiB) 4489 mal betrachtet
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QTreeView

Beitrag von RHBaum »

bei nem Treeview, bzw allen Views kann man auch spalten einzeln selectieren, und sogar mehrere Elemente (zeile Spalte) die nich mal beieinander liegen muessen. Kommt halt auf die Anwendung an.
Das steuert man am view mit dem "Auswahl-Verhalten" , auf Programmierer-Englisch "Selection Behavior"

Also schau dir am QAbstractItemModel mal die Methode setSelectionBehavior und setSelectionMode und den in dem Zusammenhang definierten Typen/Constanten an ...

Ciao ...
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: QTreeView

Beitrag von DBGTMaster »

ui->tcpActionTreeView->setSelectionBehavior(QAbstractItemView::SelectRows);

ändert nichts an meinen Problem :(
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: QTreeView

Beitrag von nebler »

Verwendest Du ein eigenes Delegate?
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: QTreeView

Beitrag von DBGTMaster »

Ja, sollte ich dabei etwas beachten :) ?
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: QTreeView

Beitrag von nebler »

Ggf. hast Du die "paint()" Methode nicht richtig überschrieben und somit zeichnest Du das nicht richtig.

Es gibt im QItemDelegate ein paar Funktionen die Dir helfen sollten es richtig zu zeichnen ...
"drawDisplay()" ...

--

Wenn Du die Methode nicht überschrieben hast hilft ggf. das Flag "allColumnsShowFocus"
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: QTreeView

Beitrag von DBGTMaster »

nebler hat geschrieben:Ggf. hast Du die "paint()" Methode nicht richtig überschrieben und somit zeichnest Du das nicht richtig.

Es gibt im QItemDelegate ein paar Funktionen die Dir helfen sollten es richtig zu zeichnen ...
"drawDisplay()" ...

--

Wenn Du die Methode nicht überschrieben hast hilft ggf. das Flag "allColumnsShowFocus"
Hallo,

es liegt definitiv am delegate, wenn ich dieses entferne, funktioniert alles Prima... Habe derzeit das Delegate nur auf die Spalte "2" gezogen, wenn ich dieses über die ganze Tabelle ziehe, habe ich auch auf der ganzen Tabelle das Problem, dass es nicht mehr nach Windows 7 Style aussieht...

Mein Delegate

Code: Alles auswählen

#include "System/TcpCommandsPermissions/TcpCommandsItemDelegate.h"

#include <QComboBox>
#include <QMap>
#include <QString>
#include <QDebug>

#include "System/TcpCommandsPermissions/TcpCommandsItem.h"
#include "System/TcpCommandsPermissions/TcpCommandsItemModel.h"

TcpCommandsItemDelegate::TcpCommandsItemDelegate(QObject *parent) :
    QItemDelegate(parent)
{
}


QWidget* TcpCommandsItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                                           const QModelIndex &index) const {
    QComboBox *combo = new QComboBox(parent);

    // Systemgruppe, welche aktuell ausgewählt ist:
    int actGroup = static_cast<TcpCommandsItem*>(
                        static_cast<TcpCommandsItemModel*>( const_cast<QAbstractItemModel*>(index.model()) )->itemFromIndex(index)
                )->id();

    if (actGroup == 0) {
        combo->addItem(" - Keine Gruppe -", QVariant(0));
        combo->setCurrentIndex(0);
    }

    /**
      * Alle Systemgruppen in die ComboBox einfügen:
      */
    QMap<quint32, QString> systemGroups = static_cast<TcpCommandsItemModel*>(
                const_cast<QAbstractItemModel*>(index.model() )
                )->getAllSystemGroups();
    QMap<quint32, QString>::iterator it;
    for(it = systemGroups.begin(); it != systemGroups.end(); it++) {

        combo->addItem( it.value(), QVariant( it.key() ) );

        // Wenn es die aktuelle Systemgruppe ist, so als Standard wählen:
        if (actGroup == it.key()) {
            combo->setCurrentIndex( combo->count() - 1 );
        }
    }

    // Signal darf erst verbunden werden, nachdem alle Einträge erstellt wurden,
    // ansonste wird das Signal sofort geworfen...
    connect(combo, SIGNAL(currentIndexChanged(int)), this, SIGNAL(sysGroupValueChanged()));

    return combo;
}

void TcpCommandsItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {

}

void TcpCommandsItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                  const QModelIndex &index) const {

    QComboBox* combo = static_cast<QComboBox*>(editor);
    quint32 sysGroupId = combo->itemData( combo->currentIndex() ).toInt();

    // Wenn sysGroupId == "0" ist, so wurde wieder "- Keine Gruppe -" ausgewählt...
    if (sysGroupId == 0) return;

    QMap<quint32, QString> systemGroups = static_cast<TcpCommandsItemModel*>(
                const_cast<QAbstractItemModel*>(index.model() )
                )->getAllSystemGroups();
    QMap<quint32, QString>::iterator i = systemGroups.find(sysGroupId);

    // neue Systemgruppe im Item setzen:
    model->setData(index, i.value(), Qt::DisplayRole);
    model->setData(index, sysGroupId, Qt::UserRole + 1);
}

void TcpCommandsItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
                                                const QModelIndex &index) const {

    editor->setGeometry( option.rect );
}
Antworten