Seite 1 von 1

Gibt es ein Signal bei beliebigen Feldänderungen?

Verfasst: 26. November 2012 11:04
von GoaSkin
Hallo,


bei den meisten Programmen ist z.B. die Speichern-Schaltfläche so lange ausgegraut, bis man eine Änderung am Dokument vornimmt.

Um sich bei einem QT-Programm nun nicht die Mühe machen zu müssen, für jedes einzelne Widget eine Verbindung setzen zu müssen, würde es mich interessieren, ob es ein Signal gibt, das gesendet wird, wenn Änderungen an einem beliebigen Eingabe-Widget innerhalb eines Fensters oder eines Containers vorgenommen werden. Der Designer macht da keine geeigneten Vorschläge.

Re: Gibt es ein Signal bei beliebigen Feldänderungen?

Verfasst: 26. November 2012 11:52
von Blubb
Wäre mir nicht bekannt, dass es eine solche Möglichkeit von Haus aus gibt. Momentan benutze ich für solche Dinge einen abgeleiteten QDataWidgetMapper der die User property der Widgets mit einem modified Signal connected und somit den übergeordneten Dialog benachrigtigt.

Code: Alles auswählen

QMetaProperty prop = widget->metaObject()->userProperty();
int signal = prop.notifySignalIndex();
int method = this->metaObject()->indexOfMethod("viewModified()");
if(signal != -1 && method != -1)
    QMetaObject::connect(widget, signal, this, method);

Re: Gibt es ein Signal bei beliebigen Feldänderungen?

Verfasst: 26. November 2012 12:41
von odt
Zwar könntest Du vermutlich irgendwie die Events der QLineEdit's via EventFilter "abzwacken", aber was ist wenn es weitere Controlarten gibt? Was wenn ein QLineEdit nur GUI-Relevant ist? Daher liegt die Zuständig des "Modified" meiner Meinung im ProblemDomain (Model) und dem Observer-Pattern. In meinen plain old objects sähe das etwa so aus:

Code: Alles auswählen

void Person::setGeburtsdatum( const QDateTime& v ){
  if( _geburtsdatum == v )
    return;
  _geburtsdatum = v;
  setModified();
}
Das setModified liegt in einem genelleren BusinessObject, setzt _isModified auf true und emitted ein signal modified. Dieses wurde im GUI connectet.
Da ich kaum mit dem Model-Klassen von Qt arbeite, bin ich unsicher, ob diese neben dem Observer-Pattern auch ein isModified bereitstellen. Zumindest QTextDocument hat ein Modified-Flag und ein contentsChanged-Signal.