qtablewidget + delegate

Alles rund um die Programmierung mit Qt
Antworten
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

qtablewidget + delegate

Beitrag von darmstadt »

In dem beispiel:

http://www.qtforum.de/forum/viewtopic.php?p=3893&

ist erklärt wie man einen qtablewidget erstellt (soweit ok). Dann wie man einen checkbox einbaut (auch ok). Dann is erklärt wie man einen combobox Delegate erstellt allerdings ist nicht erklärt wie man den delegate in den qtablewidget einbaut. Ich habe probiert:

table->setItemDelegate(comboboxDelegate);

Es geht leider nicht. Ist es möglich überhaupt? wenn nich wie kann ich eine Qtablewidget oder Qtableview mit einem combobox machen (das ganze soll dann in einem dialog angezeigt werden).

danke
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Qtablewidget (item based) oder Qtableview (model based) sind 2 total verschiedene tabellen... obwohl im designer fast kein unterschied zu bemerken ist...

was wills du genau mit den tabellen? sql daten liste? ich schraube gerade an model based ... QSqlQueryModel..
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

Beitrag von darmstadt »

vielen Dank patrik08 für deine Antwort,

Ich programiere eine "Zeichen"-Anwendung. In einem dialog sollten die verschidene layer in der 1. Spalte der Tabelle miniatur gezeichnet werden. In der 2. Spalte sollte einen checkbox um die Eigenschaft visible/invisible des Layer zu bestimmen. In der 3. und 4. splate sollten anderen eingenschaft des Layers bestimmtbar sein... (etwas wie bei Photoshop)

Ich weiss nicht ob QTableview oder QTableWidget dafür geeignet ist? Für andere Vorschläge wäre ich auch offen. Allerdings scheint die tabelle das beste / einfachste zu sein.

danke
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

mit 2-4 qframe und qlabel bin ich sicher das du alles genau positionieren kannst... schaue doch die qt4\examples\draganddrop an.. drag disable bool...

oder die menue steuerung eventuell (button ecc..) in einem neuen dockWidget ... im designer testen & uic -o resultat.h mein.ui ... resultat.h sagt den viel mehr..
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

Beitrag von darmstadt »

naja. Ich bin neu zu qt. Ich weiss das ich mit einem QTableWidget das machen kann was ich will. Mit qframe und soweiter... kann ich momentan wenig anfangen. Also meine Frage nochmal:


In dem beispiel:

http://www.qtforum.de/forum/viewtopic.php?p=3893&

ist erklärt wie man einen qtablewidget erstellt (soweit ok). Dann wie man einen checkbox einbaut (auch ok). Dann is erklärt wie man einen combobox Delegate erstellt allerdings ist nicht erklärt wie man den delegate in den qtablewidget einbaut. Ich habe probiert:

table->setItemDelegate(comboboxDelegate);

Es geht leider nicht. Ist es möglich überhaupt? wenn nich wie kann ich eine Qtablewidget oder Qtableview mit einem combobox machen (das ganze soll dann in einem dialog angezeigt werden).
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

Beitrag von darmstadt »

Zur veranschaulichung kopiere ich einfach den code von dem Beispielsbeitrag hierehin:

QTableWidget *table = new QTableWidget( 5, 20, this );
layout -> addWidget( table );

QStringList hheader;
hheader << tr( "Oben 1" ) << tr( "Oben 2" ) << tr( "Oben 3" );
table -> setHorizontalHeaderLabels( hheader);

QStringList vheader;
vheader << tr( "Links 1" ) << tr( "Links 2" ) << tr( "Links 3" );

Nun jetzt habe ich ein Dialog mit einem wunderbaren Table drauf. Funktioniert super. Jetzt will ich aber, in der 2. Spalte 1. Zeile einen Combobox mit den werten 2,3,4,5 hinzufuegen. Dafür benutze ich die Klasse von dem Beispielsbeitrag:

class ComboBoxDelegate : public QItemDelegate {

Q_OBJECT

public:

ComboBoxDelegate( QObject *parent = 0 );
QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const;
void setEditorData( QWidget *editor, const QModelIndex &index ) const;
void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const;

private slots:
void emitCommitData();
};


In meinem code versuche ich folgendes:
ComboBoxDelegate* cbd = new ComboBoxDelegate();
table -> setItemDelegate(cbd);

Nur, ist das, wenn es richtig ist, für die ganze Tabelle? Wenn ja, wie kann ich es auf eine Zelle begrenzen?

danke
:wink:
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

Beitrag von darmstadt »

Zur veranschaulichung kopiere ich einfach den code von dem Beispielsbeitrag hierehin:

QTableWidget *table = new QTableWidget( 5, 20, this );
layout -> addWidget( table );

QStringList hheader;
hheader << tr( "Oben 1" ) << tr( "Oben 2" ) << tr( "Oben 3" );
table -> setHorizontalHeaderLabels( hheader);

QStringList vheader;
vheader << tr( "Links 1" ) << tr( "Links 2" ) << tr( "Links 3" );

Nun jetzt habe ich ein Dialog mit einem wunderbaren Table drauf. Funktioniert super. Jetzt will ich aber, in der 2. Spalte 1. Zeile einen Combobox mit den werten 2,3,4,5 hinzufuegen. Dafür benutze ich die Klasse von dem Beispielsbeitrag:

class ComboBoxDelegate : public QItemDelegate {

Q_OBJECT

public:

ComboBoxDelegate( QObject *parent = 0 );
QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const;
void setEditorData( QWidget *editor, const QModelIndex &index ) const;
void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const;

private slots:
void emitCommitData();
};


In meinem code versuche ich folgendes:
ComboBoxDelegate* cbd = new ComboBoxDelegate();
table -> setItemDelegate(cbd);

Nur, ist das, wenn es richtig ist, für die ganze Tabelle? Wenn ja, wie kann ich es auf eine Zelle begrenzen?

danke
:wink:
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

das ist doch das selbe wie http://www.qtforum.de/forum/viewtopic.php?p=3893&
von florian** den forum amministrator... seit 20.4.2006 sehe ich kein eintrag von ihm.... er kann sicher helfen ... obwohl ich sicher bin das bringt man auch mit dem designer zustande...
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

Beitrag von darmstadt »

Natürlich ist es von ihm! Ich habe ja extra den link hingeschrieben.
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

Beitrag von darmstadt »

Aber, wenn du meinst ich kann das mit dem Designer machen... humm damit habe ich nicht viel gemacht...humm es ist bestimt schwer zu erklären... kannst du mir vielleicht einen typ geben.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

master ui anlage ohne tabellen... nur mit grid un vertikal horizzontal
elastisch (expanding) jede resolution...

mit header & source... auto generation ... url ...
( http://ppk.ciz.ch/qt_c++/qt/res.html ) leider nur ie....
Dateianhänge
master.zip
master ui
(2.42 KiB) 254-mal heruntergeladen
michams
Beiträge: 56
Registriert: 14. November 2005 18:24

Beitrag von michams »

darmstadt hat geschrieben: table->setItemDelegate(comboboxDelegate);
Doch, das ist der richtige Weg. Wahrscheinlich stimmt eher im Delegate was nicht.

1. Bei mir hat der Delegate Pointer noch ein "this" als Parent, weiß aber nicht, ob das von Bedeutung ist, da das Parent ja wohl anschließend auf den Table gesetzt wird.

pTmpDelegate = new CDelegateTypeBox(this);
table_Slot->setItemDelegate(pTmpDelegate);

2. Die Erzeugung der Combobox:

Code: Alles auswählen

QWidget *CDelegateTypeBox::createEditor(QWidget *parent,
                                     const QStyleOptionViewItem & /* option */,
                                     const QModelIndex &index) const
{
    if (index.column() == 0) 
    {
        // column 0 : create a combobox
        QComboBox *comboBox = new QComboBox(parent);
        
        comboBox->addItem("Things you need");

        // connect the combobox to an action at activation
        connect(comboBox, SIGNAL(activated(int)), this,         SLOT(emitCommitData()));

        return comboBox;
    }
    else
    {
        // column not 0 : create a line edit
        QLineEdit *lineEdit = new QLineEdit(parent);
        
        // take the text of the cell and put it to the line edit
        QString cs = index.model()->data(index, Qt::EditRole).toString();
        lineEdit->setText(cs);
        
        // connect the line edit to an action at keypress "ENTER"
        connect(lineEdit, SIGNAL(returnPressed()),this, SLOT(commitAndCloseEditor()));

        return lineEdit;
    }

    return NULL;
}

void CDelegateTypeBox::setModelData(QWidget *editor, QAbstractItemModel *model,
                                 const QModelIndex &index) const
{
    if(index.column()==0)
    {
        // column 0 should contain a combobox, but if not then go away
        QComboBox *comboBox = qobject_cast<QComboBox *>(editor);
        if (!comboBox)
        {    return;    }
        
        // set the text from the combobox to the model
        model->setData(index, comboBox->currentText());
    }
    else
    {
        // column not 0 should contain a line edit, but if not then go away
        QLineEdit *lineEdit = qobject_cast<QLineEdit *>(editor);
        if (!lineEdit)
        {    return;    }

        // set the text from the line edit to the model
        model->setData(index, lineEdit->text());
    }
}

void CDelegateTypeBox::emitCommitData()
{
    emit commitData(qobject_cast<QWidget *>(sender()));
}

void CDelegateTypeBox::commitAndCloseEditor()
{
    QWidget *editor = qobject_cast<QWidget *>(sender());
    emit commitData(editor);    // commit data of sender
    emit closeEditor(editor);   // close the sender
}

Das erzeugt eine Combobox in der gesamten Spalte 0 und normale Line Edits in allen anderen Spalten. Wenn du es auf einzelne Zellen beschränken willst, mußt du neben dem "column" jeweils auch die "row" checken.
Das Ganze ist bei mir so in einem Projekt eingebaut, ich hab es lediglich auf das Wesentliche zusammengekürzt.
Und: Es sieht wesentlich komplizierter aus, als es ist.
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

Beitrag von darmstadt »

Ja, das ist es!

vielen dank
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

Beitrag von darmstadt »

Jetzt habe ich einen Table mit combobox auf der 1. Spalte. Alles klappt wunderbar. Nun will ich das was der User ausgewählt hat rauskreigen. Mit einem normalen QTableWidgetItem würde ich folgendes mache:

QTableWidgetItem* a = table->itemAt(0,0);
QString test = a->text();

Nur, mit dem combobox delegate auf (0,0) geht das nicht!! Wie solle ich das machen?

vielen Dank
michams
Beiträge: 56
Registriert: 14. November 2005 18:24

Beitrag von michams »

So sollte der Zugriff eigentlich funktionieren, was genau geht denn daran nicht?
Antworten