[solved] QTableView - Focus im Editorwidget

Alles rund um die Programmierung mit Qt
Antworten
schmökertante
Beiträge: 13
Registriert: 5. Oktober 2010 15:09

[solved] QTableView - Focus im Editorwidget

Beitrag 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
Zuletzt geändert von schmökertante am 4. Oktober 2013 14:39, insgesamt 1-mal geändert.
pipapong
Beiträge: 4
Registriert: 9. April 2013 15:47

Re: QTableView - Focus im Editorwidget

Beitrag 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
schmökertante
Beiträge: 13
Registriert: 5. Oktober 2010 15:09

Re: QTableView - Focus im Editorwidget

Beitrag 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.
schmökertante
Beiträge: 13
Registriert: 5. Oktober 2010 15:09

Re: [solved] QTableView - Focus im Editorwidget

Beitrag von schmökertante »

Hallo,
hier steht die Lösung:
http://stackoverflow.com/questions/1214 ... ride-event

Wer suchet - der findet...
Antworten