Gibt es ein Signal bei beliebigen Feldänderungen?

Alles rund um die Programmierung mit Qt
Antworten
GoaSkin
Beiträge: 103
Registriert: 13. Juni 2007 00:14
Wohnort: Darmstadt

Gibt es ein Signal bei beliebigen Feldänderungen?

Beitrag 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.
Blubb
Beiträge: 15
Registriert: 22. August 2009 10:53

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

Beitrag 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);
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

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

Beitrag 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.
ODT Informatik GmbH, Reto Tschofenig
Antworten