Seite 1 von 1
qtablewidget + delegate
Verfasst: 25. April 2006 09:51
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
Verfasst: 25. April 2006 10:28
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..
Verfasst: 25. April 2006 13:50
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
Verfasst: 25. April 2006 14:14
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..
Verfasst: 25. April 2006 14:39
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).
Verfasst: 25. April 2006 14:51
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

Verfasst: 25. April 2006 14:52
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

Verfasst: 25. April 2006 16:11
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...
Verfasst: 25. April 2006 16:47
von darmstadt
Natürlich ist es von ihm! Ich habe ja extra den link hingeschrieben.
Verfasst: 25. April 2006 16:49
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.
Verfasst: 25. April 2006 17:21
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....
Verfasst: 26. April 2006 07:21
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.
Verfasst: 28. April 2006 09:33
von darmstadt
Ja, das ist es!
vielen dank
Verfasst: 28. April 2006 10:35
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
Verfasst: 3. Mai 2006 08:25
von michams
So sollte der Zugriff eigentlich funktionieren, was genau geht denn daran nicht?