qtablewidget + delegate
qtablewidget + delegate
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
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
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
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
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..
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..
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).
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).
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

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
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

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
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...
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...
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....
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) 255-mal heruntergeladen
Doch, das ist der richtige Weg. Wahrscheinlich stimmt eher im Delegate was nicht.darmstadt hat geschrieben: table->setItemDelegate(comboboxDelegate);
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 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.
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
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