Seite 1 von 1

[solved] QTableView - Focus im Editorwidget

Verfasst: 20. September 2013 13:06
von schmökertante
Hallo alle zusammen,
Ich habe eine Anwendung in der ich sehr viel mit QTableView, QStandardItemModel und einer abgeleiteten Klasse von QItemDelegate arbeite.

Mein Editorfenster, welches im Delegate in createEditor erzeugt wird, betseht aus einem QWidget, welches aber ein QLineEdit und ein QPushButton mit "..." als Text beinhaltet. Über den Pushbutton kann der Anwender vordefinierte Einträge aus einem Dialog auswählen, diese werden nach Bestätigung des Dialogs in das LineEdit übernommen.

Jetzt habe ich folgende Probleme:
Nach dem erzeugen des Editors hat das LineEdit nicht den Focus. Gebe ich ihm den Focus mit setFocus() erhalte ich im Delegate im gegenzug das Event FocusOut, ist auch verständlich, weil das QWidget als Parent den Focus verliert, ignoriere ich aber das FocusOut Event, kann die Anwendung die Signale commitdata und closeEditor nicht auslösen, die Folge ist, dass bei einem click in einen nicht genutzten Bereich der TableView mein Editorfenster erhalten bleibt obwohl der Focus wo ganz anders ist, die geänderten Daten werden demzufolge auch nicht übernommen. setFocusProxy hatte auch nicht den gewünschten Erfolg.

Hat jemand schon mal sowas ähnliches gemacht? Wie bekomme ich das mit dem Focus hin, damit der Cursor nach dem Erzeugen des Editors im LineEdit ist und wie muß ich dann das FocusOut Event behandeln?

Ich hoffe ihr könnt mit meinen Erklärungen was anfangen.

Danke schon mal im Vorraus.

Grüsse
Mario

Re: QTableView - Focus im Editorwidget

Verfasst: 30. September 2013 09:04
von pipapong
hi,
wie oder was genau hast du die mit QTableView verbunden ? also wie hast du die connection gemacht? kannst den code mal posten bitte

Re: QTableView - Focus im Editorwidget

Verfasst: 1. Oktober 2013 13:51
von schmökertante
Hallo,
meine Editor Klasse sieht folgendermaßen aus:

Code: Alles auswählen

SpinBox::SpinBox(QWidget *parent, int fNr, QString regExp, QAbstractSpinBox::ButtonSymbols bs)
  : QWidget(parent),
    edit(new QSpinBox(parent)),
    pb(new QToolButton(parent)),
    layout(new QHBoxLayout(parent))
{
  fieldNr = fNr;
  edit->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
  edit->setButtonSymbols(bs);
  edit->setMinimum(0);
  edit->setMaximum(1e+06);
  edit->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
  if(!regExp.isEmpty())
    validator = new QRegExpValidator(QRegExp(regExp), this);
  pb->setText("...");
  pb->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Ignored);
  pb->setFixedWidth(20);
  layout->addWidget(edit);
  layout->addWidget(pb);
  layout->setMargin(0);
  layout->setSpacing(0);
  connect(pb, SIGNAL(clicked()), this, SLOT(buttonClicked()));
  setFocusProxy(edit);
  //setFocusPolicy(Qt::NoFocus);
  setLayout(layout);
  //QTimer::singleShot(500, edit, SLOT(setFocus()));
}
die zugehörige Header:

Code: Alles auswählen

class SpinBox : public QWidget
{
  Q_OBJECT

public:
  SpinBox(QWidget *parent, int fNr=-1, QString regExp="", QAbstractSpinBox::ButtonSymbols bs=QAbstractSpinBox::NoButtons);
  QValidator::State validate(QString &text, int &pos) const { return validator->validate(text, pos); }
  void setSingleStep(int val) { edit->setSingleStep(val); }
  void setMinMax(int min, int max) { edit->setRange(min, max); }
  void setData(int value) { edit->setValue(value); }
  void setSuffix(QString suffix) { edit->setSuffix(suffix); }
  void setPrefix(QString prefix) { edit->setPrefix(prefix); }
  int getData() { return edit->value(); }

Q_SIGNALS:
  void editingFinished();

private slots:
  void buttonClicked();

private:
  int fieldNr;
  QSpinBox *edit;
  QToolButton *pb;
  QHBoxLayout *layout;
  QRegExpValidator *validator;
};
der Aufruf im Delegate:

Code: Alles auswählen

QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
    const QStyleOptionViewItem &/* option */,
    const QModelIndex &index) const
{
  SpinBox *editor = new SpinBox(parent);
  editor->setMinMax(0,100);
  return editor;
}
mehr ist es nicht!

die problematische Stelle müßte die in der Editor Klasse sein mit dem Focus setzen. Oder aber die Abfrage vom FocusOut Event im eventhandler des Delegates?

Vielleicht kann ja jemand helfen.

Dank schon mal.

Re: [solved] QTableView - Focus im Editorwidget

Verfasst: 4. Oktober 2013 14:46
von schmökertante
Hallo,
hier steht die Lösung:
http://stackoverflow.com/questions/1214 ... ride-event

Wer suchet - der findet...