[gelöst] QTableWidgetItem nur Zahlen schreibar?
[gelöst] QTableWidgetItem nur Zahlen schreibar?
Hallo,
kann man irgendwie so konfigurieren dass man in einer Zelle einer Tabelle nur Zahlen reinschreiben kann? Also dass Buchstaben und andere Zeichen erst gar nicht erscheinen.
Oder geht das nur durch eine Überprüfung mit der Methode renewTable ?
Dass Buchstaben erscheinen, aber erst beim Returnen wieder verschwinden ist irgendwie unschön.
kann man irgendwie so konfigurieren dass man in einer Zelle einer Tabelle nur Zahlen reinschreiben kann? Also dass Buchstaben und andere Zeichen erst gar nicht erscheinen.
Oder geht das nur durch eine Überprüfung mit der Methode renewTable ?
Dass Buchstaben erscheinen, aber erst beim Returnen wieder verschwinden ist irgendwie unschön.
Zuletzt geändert von forgoden am 21. Mai 2009 19:57, insgesamt 1-mal geändert.
funktioniert das nur mit QTableView?
Meins war QTableWidget. Dort
delegate.h und .cpp habe ich eingebunden aus diesem beispiel
jetzt wenn ich mache. wird alles weiss (leer) angezeigt. Obwohl irgendwie noch Werte versteckt sind
edit: offenstlich funktioniert auch mit QTableView nicht
man so verwirrend, obwohl der code ziemlich exakt ist
edit2: okay es funktioniert nur in main()
aber nicht in der geerbten klasse von : public QWidget, private Ui::Macros
edit3: aaaargh es ist wegen dem hier! hab ich vergessen als new zu erzeugen
edit4: aber es funktioniert nicht mit QTableWidget! wegen dem hier: tableWidget->setModel(model);
da kommt fehlermeldung:
wieso ist das virtual definiert?
und wieso wird in Assistant QTableWidget kein setModel angezeigt obwohl diese dennoch in QTableWidget.h vorhanden ist?
hmm was soll ich jetzt machen?
Meins war QTableWidget. Dort
delegate.h und .cpp habe ich eingebunden aus diesem beispiel
jetzt wenn ich
Code: Alles auswählen
SpinBoxDelegate delegate_;
tableWidget->setItemDelegate(&delegate_);
tableWidget->horizontalHeader()->setStretchLastSection(true);edit: offenstlich funktioniert auch mit QTableView nicht
man so verwirrend, obwohl der code ziemlich exakt ist
edit2: okay es funktioniert nur in main()
aber nicht in der geerbten klasse von : public QWidget, private Ui::Macros
edit3: aaaargh es ist wegen dem hier!
Code: Alles auswählen
SpinBoxDelegate delegate;edit4: aber es funktioniert nicht mit QTableWidget! wegen dem hier: tableWidget->setModel(model);
da kommt fehlermeldung:
Code: Alles auswählen
error C2248: "QTableWidget::setModel": Kein Zugriff auf private Member, dessen Deklaration in der QTableWidget-Klasse erfolgte.
c:\qt\4.5.1\include\qtgui\../../src/gui/itemviews/qtablewidget.h(337): Siehe Deklaration von 'QTableWidget::setModel'und wieso wird in Assistant QTableWidget kein setModel angezeigt obwohl diese dennoch in QTableWidget.h vorhanden ist?
hmm was soll ich jetzt machen?
ist aber viel text...
ich dachte man muss nicht umschreiben.
könnte man irgendwie mit casten austricksen?
glaub das wird mir zu kompliziert. will nicht alle felder spinbox machen
die 3. spalte soll doublespinbox sein
die vielen tableobjekte QModelIndex, QTableView, QAbstractTableModel, QStandardItemModel usw... bringen mir durcheinander. Gibt es überhaupt ne grafische Baumdarstellung von solchen Klassen?
ich dachte man muss nicht umschreiben.
könnte man irgendwie mit casten austricksen?
glaub das wird mir zu kompliziert. will nicht alle felder spinbox machen
die 3. spalte soll doublespinbox sein
die vielen tableobjekte QModelIndex, QTableView, QAbstractTableModel, QStandardItemModel usw... bringen mir durcheinander. Gibt es überhaupt ne grafische Baumdarstellung von solchen Klassen?
Der Sinn der Schule ist ja auch nicht der Bücher zu ersetzen, sondern Schüler notfalls zu zwingen, sich ETWAS Bildung anzueignen sei es Geschichte, Mathe oder (gutes) Deutsch 
Und die Doku ist auch nicht soooo umfangreich. (Sei froh dass du bei Qt eine solche Doku mit diesem Umfang hast und reg dich nicht drüber auf
)
Es gibt bei jedem Thema immer auch Links zu "See also" Themen. irgendwann gehts nicht anders und du stolperst über ein kleines Beispiel, das "Color editor Factory" Example. Das kannst du wahrscheinlich 1:1,3 übernehmen. Viel Erfolg dabei
(Alles andere wäre schon die Lösung, und hier wird keiner bezahlt, im Gegensatz zum Lehrer in der Schule...)
Und die Doku ist auch nicht soooo umfangreich. (Sei froh dass du bei Qt eine solche Doku mit diesem Umfang hast und reg dich nicht drüber auf
Es gibt bei jedem Thema immer auch Links zu "See also" Themen. irgendwann gehts nicht anders und du stolperst über ein kleines Beispiel, das "Color editor Factory" Example. Das kannst du wahrscheinlich 1:1,3 übernehmen. Viel Erfolg dabei
Bevor du dich am Ende doch zu sehr verrennst, so könnte man es z.B. machen:
Beachte, dass nur Int und Invalid nen Editor bekommen. Solltest du auch noch Strings usw. haben wollen, musst du das noch selber ergänzen.
Grüße
Franz
Code: Alles auswählen
#include <QtGui>
int main( int argc, char **argv )
{
QApplication app( argc, argv );
QItemEditorFactory *factory = new QItemEditorFactory;
QItemEditorCreatorBase *intCreator = new QStandardItemEditorCreator<QSpinBox>();
// Wenn noch keine Daten im Feld stehen, soll eine Spinbox aufgehen
factory->registerEditor( QVariant::Invalid, intCreator );
// Für ein int bitte eine SpinBox!
factory->registerEditor( QVariant::Int, intCreator );
QItemEditorFactory::setDefaultFactory( factory );
QTableWidget table( 10, 5 );
for( int i=3; i<9; i++ ) {
for( int j=2; j<4; j++ ) {
QTableWidgetItem *item = new QTableWidgetItem;
item->setData( Qt::DisplayRole, i*j );
table.setItem( i, j, item );
}
}
table.show();
return app.exec();
}
Grüße
Franz
ja danke. nach 3 tagen rumprobieren hab ichs auch endlich hingekriegt.
mein code ist etwas ähnlich. erst mal die Klasse SpinBoxDelegate:hier z.b. soll value nur von 0 bis 3 gehen
dann der code für den Editor:
und beim erzeugen:
statt QItemEditorFactory::setDefaultFactory( factory );
habe ich hierfür
QItemDelegate *delegat = new QItemDelegate;
delegat->setItemEditorFactory(factory);
tableWidget->setItemDelegate(delegat);
geschrieben, damit das nicht global für alle Tabellen und Felder gelten. Das 2x doppelzeichen "::" steht für Global setzen wenn ich mich nicht Irre.
Was mir allerdings nicht so klar ist, wie ich in der selben Tabelle noch andere Editoren setzen kann. Denn cell4->setData(Qt::DisplayRole, 1 ); bestimmt nicht welchen Editor verwendet werden soll. Wenn ich z.b. zwei SpinBox-Editoren erzeuge, beide mit int-Typen und beide haben verschiedene maximum-, minimum-Werte nimmt er immer den letzten, wenn ich so schreibe:
nur das mit doublespin box funktioniert, weil er wohl die unterschiedlichen QVariant unterscheiden kann.
Vlt. find ich das noch heraus (mit den Dokumenten
)
Edit:
eine idee wäre:
wenn man abfragt welcher row angeklickt wird, erst dann ein entsprechender editor in registerEditor gesetzt wird
hmm mal versuchen...
mein code ist etwas ähnlich. erst mal die Klasse SpinBoxDelegate:
Code: Alles auswählen
class SpinBoxDelegate : public QSpinBox
{
Q_OBJECT
Q_PROPERTY(int value READ value WRITE setValue USER true)
public:
SpinBoxDelegate(QWidget *widget = 0);Code: Alles auswählen
SpinBoxDelegate::SpinBoxDelegate(QWidget *widget) : QSpinBox(widget)
{
setMaximum ( 3 );
}Code: Alles auswählen
QItemEditorFactory *factory = new QItemEditorFactory;
QItemEditorCreatorBase *spinBoxCreator = new QStandardItemEditorCreator<SpinBoxDelegate>();
factory->registerEditor(QVariant::Int, spinBoxCreator);
QItemDelegate *delegat = new QItemDelegate;
delegat->setItemEditorFactory(factory);
tableWidget->setItemDelegate(delegat);Code: Alles auswählen
QTableWidgetItem* cell4 = new QTableWidgetItem;
cell4->setData(Qt::DisplayRole, 1 );habe ich hierfür
QItemDelegate *delegat = new QItemDelegate;
delegat->setItemEditorFactory(factory);
tableWidget->setItemDelegate(delegat);
geschrieben, damit das nicht global für alle Tabellen und Felder gelten. Das 2x doppelzeichen "::" steht für Global setzen wenn ich mich nicht Irre.
Was mir allerdings nicht so klar ist, wie ich in der selben Tabelle noch andere Editoren setzen kann. Denn cell4->setData(Qt::DisplayRole, 1 ); bestimmt nicht welchen Editor verwendet werden soll. Wenn ich z.b. zwei SpinBox-Editoren erzeuge, beide mit int-Typen und beide haben verschiedene maximum-, minimum-Werte nimmt er immer den letzten, wenn ich so schreibe:
Code: Alles auswählen
QItemEditorCreatorBase *spinBoxCreator0 = new QStandardItemEditorCreator<SpinBox1000Delegate>();
factory->registerEditor(QVariant::Int, spinBoxCreator0);
QItemEditorCreatorBase *spinBoxCreator1 = new QStandardItemEditorCreator<SpinBoxDelegate>();
factory->registerEditor(QVariant::Int, spinBoxCreator1);
QItemEditorCreatorBase *spinBoxCreator2 = new QStandardItemEditorCreator<QDoubleSpinBox>();
factory->registerEditor(QVariant::Double, spinBoxCreator2);Vlt. find ich das noch heraus (mit den Dokumenten
Edit:
eine idee wäre:
wenn man abfragt welcher row angeklickt wird, erst dann ein entsprechender editor in registerEditor gesetzt wird
hmm mal versuchen...