ResizeToContents macht zu schmale Spalten fuer Editor
ResizeToContents macht zu schmale Spalten fuer Editor
Ich habe eine QTableView mit
[code]setResizeMode(QHeaderView::ResizeToContents);[/code]
auf automatische Spaltenbreite eingestellt.
Eine, zum Editieren eingebaute, QComboBox ist aber jetzt so schmal, dass man nicht erkennen kann, was man auswählt.
Erst wenn es ein paar Einträge gibt, die die Spalte "aufweiten", kann man auch in der QComboBox was erkennen.
Gibt's es eine Möglichkeit, die Spaltenbreite, fuer den Editor (hier die QComboBox) schon zu verbreitern ?
Oder dass ResizeToContents, nicht nur auf die [b]tatsächlichen [/b]Werte sondern, die auf alle [b]möglichen [/b]Werte des Models schaut ?
Danke Heinz
[code]setResizeMode(QHeaderView::ResizeToContents);[/code]
auf automatische Spaltenbreite eingestellt.
Eine, zum Editieren eingebaute, QComboBox ist aber jetzt so schmal, dass man nicht erkennen kann, was man auswählt.
Erst wenn es ein paar Einträge gibt, die die Spalte "aufweiten", kann man auch in der QComboBox was erkennen.
Gibt's es eine Möglichkeit, die Spaltenbreite, fuer den Editor (hier die QComboBox) schon zu verbreitern ?
Oder dass ResizeToContents, nicht nur auf die [b]tatsächlichen [/b]Werte sondern, die auf alle [b]möglichen [/b]Werte des Models schaut ?
Danke Heinz
- Dateianhänge
-
- combo.jpg (17.59 KiB) 5407 mal betrachtet
Was hast denn bei der ComboBox unter SizeAdjustPolicy stehen?
AdjustToContents?
Weil wenn es auf AdjustToContentsOnFirstShow steht ist es klar woher der Fehler kommt
AdjustToContents?
Weil wenn es auf AdjustToContentsOnFirstShow steht ist es klar woher der Fehler kommt
Zuletzt geändert von AuE am 21. Januar 2009 11:54, insgesamt 1-mal geändert.
Hallo AuE,
ich hatte da garnichts, aber aber AdjustToContents bringt auch nichts ;-(
Es sieht so aus, als ob die View garnicht auf den Editor reagiert ...
Hier noch mal mein Delegate:
[code]
QWidget *NameDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem&, const QModelIndex&) const {
QComboBox *comboBox = new QComboBox(parent);
comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
comboBox->setEditable(true);
comboBox->clear();
comboBox->addItems(....);
return comboBox;
}
[/code]
PS: die code/quotes funktionieren hier bei mir nicht
ich hatte da garnichts, aber aber AdjustToContents bringt auch nichts ;-(
Es sieht so aus, als ob die View garnicht auf den Editor reagiert ...
Hier noch mal mein Delegate:
[code]
QWidget *NameDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem&, const QModelIndex&) const {
QComboBox *comboBox = new QComboBox(parent);
comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
comboBox->setEditable(true);
comboBox->clear();
comboBox->addItems(....);
return comboBox;
}
[/code]
PS: die code/quotes funktionieren hier bei mir nicht
Ja.
Die TableView wird ja zuerst vom Model "gefüllt".
Dann click man irgendwo hin, das Delegate baut die Combobox (mit dem "breiten" Werten. Wenn man dann "blind" einen auswählt, wird der Wert ins Model geschrieben und die Spalte in der Table passt sich auch an.
Es wäre nur besser, wenn das schon fuer die ComboBox passiert ...
[code]
MapTable::MapTable(QWidget* parent, MapModel* _model) : QWidget(parent) {
mapView = new QTableView;
mapView->setModel(_model);
mapView->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
nameDelegate = new NameDelegate(this);
mapView->setItemDelegateForColumn(2, nameDelegate);
...
[/code]
Die TableView wird ja zuerst vom Model "gefüllt".
Dann click man irgendwo hin, das Delegate baut die Combobox (mit dem "breiten" Werten. Wenn man dann "blind" einen auswählt, wird der Wert ins Model geschrieben und die Spalte in der Table passt sich auch an.
Es wäre nur besser, wenn das schon fuer die ComboBox passiert ...
[code]
MapTable::MapTable(QWidget* parent, MapModel* _model) : QWidget(parent) {
mapView = new QTableView;
mapView->setModel(_model);
mapView->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
nameDelegate = new NameDelegate(this);
mapView->setItemDelegateForColumn(2, nameDelegate);
...
[/code]
ok- was wäre wenn du dieses QHeaderView::resizeTo Contents rausschmeißt, und dann einfach beim einlesen der Daten oder im Delegaten dir nen Signal schmeißt das mit dem Slot resizeColkumnsToContents() verbunden ist?
Oder ruf einfach nur die Fkts auf....
to distribute the available space according to the space requirement of each column or row, call the view's resizeColumnsToContents() or resizeRowsToContents() functions.
Oder ruf einfach nur die Fkts auf....
to distribute the available space according to the space requirement of each column or row, call the view's resizeColumnsToContents() or resizeRowsToContents() functions.
Da ist mir nicht klar, wie das gehen koennte ?
Im Delegate habe ich ja garkeinen Zugriff auf die View ?
Ich weiss auch nicht, wann ich das resizeColumnsToContents() aufrufen darf ?
Muss man echt vorab die Spaltengroesse (irgendwie ?) berechnen und dann eine fixe Spaltenbreite festlegen ? Das ist schon sehr unflexibel
Im Delegate habe ich ja garkeinen Zugriff auf die View ?
Ich weiss auch nicht, wann ich das resizeColumnsToContents() aufrufen darf ?
Muss man echt vorab die Spaltengroesse (irgendwie ?) berechnen und dann eine fixe Spaltenbreite festlegen ? Das ist schon sehr unflexibel
nein, das musst du sicher nicht.
wenn du aus dem delegaten das nicht aufrufen darfst.... darfst du dort aber bestimmt nen Signal via emit rausschicken worauf du dann wo anders reagierst.
Vorschlag:
Im Delegaten machst du nen emit new_data() und das connectest du halt zu nen definierten Slot von dir. In dem Slot rufst dann resizeColumnsToContents() auf
wenn du aus dem delegaten das nicht aufrufen darfst.... darfst du dort aber bestimmt nen Signal via emit rausschicken worauf du dann wo anders reagierst.
Vorschlag:
Im Delegaten machst du nen emit new_data() und das connectest du halt zu nen definierten Slot von dir. In dem Slot rufst dann resizeColumnsToContents() auf
Hallo AuE,
ich habe noch ein wenig expermientiert.
Eigentlich war dein erster Hinweis schon Ok.
Bei der View habe ich im Moment ResizeToContents gesetzt.
Der Aufruf:
comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
muss nur in der Delegate::setEditorData() Funktion gemacht werden,
nachdem die ComboBox schon gefuellt ist. Dann klappt's ziemlich gut.
Es wird zwar nicht die Spalte vergroessert, aber die ComboBox einfach
groesser druebergelegt.
Vielen Dank fuer die Hilfe !
ich habe noch ein wenig expermientiert.
Eigentlich war dein erster Hinweis schon Ok.
Bei der View habe ich im Moment ResizeToContents gesetzt.
Der Aufruf:
comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
muss nur in der Delegate::setEditorData() Funktion gemacht werden,
nachdem die ComboBox schon gefuellt ist. Dann klappt's ziemlich gut.
Es wird zwar nicht die Spalte vergroessert, aber die ComboBox einfach
groesser druebergelegt.
Vielen Dank fuer die Hilfe !
und die Spaltengröße könntest du wie schon erwähnt dir im Delegaten nen Signal setzen. Und in dem connecteten Slot machst du dann deineView->resizeColumnsToContents();
Dann sollten auch die Spalten passen. Allerdings darfst du in dem Fall nicht das QtHeader::Stretch machen. Denn wenn du das einmal drin hast kannst du die Spaltenbreite nicht mehr anpassen. Die ist dann fix. Siehe Doku!
Dann sollten auch die Spalten passen. Allerdings darfst du in dem Fall nicht das QtHeader::Stretch machen. Denn wenn du das einmal drin hast kannst du die Spaltenbreite nicht mehr anpassen. Die ist dann fix. Siehe Doku!
Du meinst ja wahrscheinlich so:
[code]mapView = new QTableView;
cellDelegate = new NameDelegate(this);
mapView->setItemDelegateForColumn(2, nameDelegate);
connect(nameDelegate,
SIGNAL(needIt()),
mapView,
SLOT(resizeColumnsToContents()));
....
void NameDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const {
QComboBox *comboBox = static_cast<QComboBox*>(editor);
comboBox->addItems(...);
comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
emit needIt();
}[/code]
Klappt leider nicht.
Aber die bisherige Variante ist schon ok.
Danke nochmal !
[code]mapView = new QTableView;
cellDelegate = new NameDelegate(this);
mapView->setItemDelegateForColumn(2, nameDelegate);
connect(nameDelegate,
SIGNAL(needIt()),
mapView,
SLOT(resizeColumnsToContents()));
....
void NameDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const {
QComboBox *comboBox = static_cast<QComboBox*>(editor);
comboBox->addItems(...);
comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
emit needIt();
}[/code]
Klappt leider nicht.
Aber die bisherige Variante ist schon ok.
Danke nochmal !
Joa... vom Prinzip her genauso. Wenn du das Signal noch richtig deklariert hast(wovon ich ausgehe) sollte es eigentlich gehen.
Klappt denn das Connect?

Klappt denn das Connect?
Auch wenns schon geklärt ist.... aber es muss ja gehen das alles genau passt....void QTableView::resizeColumnsToContents () [slot]
Resizes all columns based on the size hints of the delegate used to render each item in the columns.
"Falsche" connects kommen bei mir auf einem Error Handler raus.
Ist aber hier nicht der fall.
Ich nehme an, dass das signal zum Falsche Zeitpunkt kommt,
oder dass beim Resize der Editor nicht beruecksichtig wird...
class NameDelegate : public QItemDelegate {
Q_OBJECT
public:
...
void setEditorData(QWidget *editor, const QModelIndex &) const;
signals:
void needIt() const;
}
Ist aber hier nicht der fall.
Ich nehme an, dass das signal zum Falsche Zeitpunkt kommt,
oder dass beim Resize der Editor nicht beruecksichtig wird...
class NameDelegate : public QItemDelegate {
Q_OBJECT
public:
...
void setEditorData(QWidget *editor, const QModelIndex &) const;
signals:
void needIt() const;
}
mhhh eigentlich sollte es klappen. 
warum es das nicht tut... gute Frage wäre wohl eher was für die Trolls.
Ich weiß nur das ich mal das Problem mit dem Resizen von nen Dialog hatte(abhängig von der Anzahl der Elemente) und das komische war das wenn ich dann einfach 2mal das Widget geresized habe dann erst hats geklappt. Vorher leider net. Aber warum... ka.. bin da auch grad mit meinen Latein am Ende aber evtl noch wer anders mit Ideen?
warum es das nicht tut... gute Frage wäre wohl eher was für die Trolls.
Ich weiß nur das ich mal das Problem mit dem Resizen von nen Dialog hatte(abhängig von der Anzahl der Elemente) und das komische war das wenn ich dann einfach 2mal das Widget geresized habe dann erst hats geklappt. Vorher leider net. Aber warum... ka.. bin da auch grad mit meinen Latein am Ende aber evtl noch wer anders mit Ideen?