Qt zuverlässig???

Verschiedenes zu Qt
Antworten
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

Qt zuverlässig???

Beitrag von Chri »

Hi
Vielleicht hängt es damit zusammen, dass ich gestern QT aktualisiert habe. Jedenfalls:
Eine bisher funktionierende Anwendung hat plötzlich anscheinend Probleme mit den Slots.

Ich habe eine Funktion inDB(), die mit einem Pushbutton aufgerufen wird und die Eingaben in einer UI in eine Datenbank speichert.
(Zuordnung Pushbutton - Funktion hab ich im Designer "Slots anzeigen" erledigt.)

Das Problem: Der Pushbutton wird ausgelöst, wenn ich eine Eingabe in einer DoubleSpinBox beende.
Auf der Suche nach dem Auslöser:
Habe am Anfang von inDB() ein qDebug<<"inDB() ausgelöst" geschrieben sowie

Code: Alles auswählen

void HT_WW_VT::on_pushButton_4_clicked()
{
        qDebug()<<"Speichern geklickt";
        inDB();
}
--> Beide Meldungen erscheinen, wenn ich eine Eingabe in einer DoubleSpinBox beende.

Eine erweiterte Suche nach inDB() bzw. on_pushButton_4_clicked() brachte kein Ergebnis.

Habe mehrfach alles bereinigt, alles neu erstellt, pushbutton umbenannt, pushbautton gelöscht und neu erstellt.
Das Ergebnis: inDB() wird nur ausgelöst, wenn ich den pushbutton klicke.
ABER:
Nun wird plötzlich ein anderer pushButton ausglöst, der für die Funktion ausDB() zuständig ist. (Holt aus der Datenbank die Werte zurück).
Bedeutet: Ich gebe was in eine DoubleSpinBox ein und wenn ich die Eingabe beende, ist wieder der ursprüngliche Wert drinnen.

Was soll ich tun?

LG
Chri
Die Sprache des Technikers ist die Skizze
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Qt zuverlässig???

Beitrag von Christian81 »

1. Slots selbst connecten und nicht connectSlotsByName() benutzen
2. Alles soweit vereinfachen bis es nicht mehr auftritt

Ohne Code können wir so nichts weiter sagen

und btw: Satzzeichen sind keine Rudeltiere ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Re: Qt zuverlässig???

Beitrag von hilefoks »

Das Qt an dieser Stelle "unzuverlässig" sein könnte, kann ich ziemlich sicher mit Nein beantworten. ;-)

Es muss jemanden geben, der deinen Slot aufruft. Wenn suchen nach Slot-Namen nicht weiterhilft, dann benutze einen Debugger oder lass dir ausgeben, wer der Sender des Signals ist:

Code: Alles auswählen

void HT_WW_VT::on_pushButton_4_clicked()
{
    if(sender()) {
        sender()->dumpObjectInfo();
    }
    else {
        qDebug() << "No sender!"
    }

    ///...
}
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

Re: Qt zuverlässig???

Beitrag von Chri »

Hi
Habe alles abgespeckt: In der ui sind 2 Pushbuttons und eine doublespinbox.
Am seltsamen Verhalten hat sich nichts geändert:
Wenn ich in der doublespinbox den Wert ändere, wird die Funktionvom Pushbutton pBHolen aufgerufen.
Ha - etwas hat sich durch die Abspeckaktion geändert:
Es wird nicht mehr Pushbutton pBHolen sondern pushButton_4 aufgerufen!

Code: Alles auswählen

#ifndef HT_WW_VT_H
#define HT_WW_VT_H
#include <QtCore>
#include <QtGui>
#include <QDialog>
#include <QWidget>
#include <QtSql>


namespace Ui {
class HT_WW_VT;
}

class HT_WW_VT : public QWidget
{
    Q_OBJECT

public:
    explicit HT_WW_VT(QWidget *parent = 0);
    ~HT_WW_VT();
    QStandardItemModel *qmod;
    Ui::HT_WW_VT *ui;



private slots:
    void on_pBHolen_clicked();
    void on_pushButton_4_clicked();


private:
};


#endif // HT_WW_VT_H

Code: Alles auswählen

#include "ht_ww_vt.h"
#include "ui_ht_ww_vt.h"

#include <QDebug>
#include <QButtonGroup>
#include <QtCore>
#include <QtGui>
#include <QScrollArea>



HT_WW_VT::HT_WW_VT(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::HT_WW_VT)
{
    ui->setupUi(this);

}

HT_WW_VT::~HT_WW_VT()
{
    delete ui;
}


void HT_WW_VT::on_pushButton_4_clicked()
{
        if(sender()) {
            sender()->dumpObjectInfo();
        }
        else {
            qDebug() << "No sender!";
        }
        qDebug()<<"Speichern geklickt";
}


void HT_WW_VT::on_pBHolen_clicked()
{
        if(sender()) {
            sender()->dumpObjectInfo();
        }
        else {
            qDebug() << "No sender!";
        }
        qDebug()<<"Holen Aus DB geklickt";
}


Wenn ich den Wert der doublespinbox ändere:
Ausgabe:

Code: Alles auswählen

OBJECT QPushButton::pushButton_4
  SIGNALS OUT
        signal: destroyed(QObject*)
          <functor or function pointer>
        signal: destroyed()
        signal: objectNameChanged(QString)
        signal: windowTitleChanged(QString)
        signal: windowIconChanged(QIcon)
        signal: windowIconTextChanged(QString)
        signal: customContextMenuRequested(QPoint)
        signal: pressed()
        signal: released()
        signal: clicked(bool)
          --> HT_WW_VT::tab_WWVT on_pushButton_4_clicked()
  SIGNALS IN
        <None>
Speichern geklickt
Sehe keinen Hinweis auf den Auslöser
zu Slots selbst connecten und nicht connectSlotsByName() benutzen:
Warum, wenn QT-Creator dies anbietet. Ist doch bequemer. Kann man sich doch nicht darauf verlassen?
Natürlich kann man Alles selber machen, doch irgend wann: Wozu dann überhaupt QT-Creator?

LG
Chri
Die Sprache des Technikers ist die Skizze
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Qt zuverlässig???

Beitrag von Christian81 »

Etwas kompilierfähiges wäre schon nicht schlecht.
Und connectByName() - es passiert eben alles mögliche implizit und man sieht es nicht so ohne weiteres und sucht sich dumm und dämlich. Sehen wir jetzt hier an diesem Beispiel ganz gut.
Und wenn man dann doch mal einen PushButton umbenennen muss funktioniert es auf einmal nicht mehr weil der Slot noch nicht umbenannt wurde usw. viel zu fehleranfällig.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

Re: Qt zuverlässig???

Beitrag von Chri »

Kompilierfähig ist schwer: Umfangreich, mit dranhängenden Datenbanken und ich darfs nicht.

Letzter Stand:
Habe in einem (Haupt) ui ein Qtabwidget mit einigen Seiten.
Für jede Seite gibt es eine eigene ui.
Dies habe ich über den Creator mit "Als Platzhalter für benutzerdefinierte Klasse festlegen" ins Qtabwidget eingebunden.
Ich füge einen pushbutton ein und zum pushbutton einen Slot (über re Maustaste)
Wenn ich nun eine doubleSpinBox einfüge (und dann das Ganze ablaufen lasse): Sobald ich den Wert der doubleSpinBox ändere, wird die mit dem pushbutton verbundene Funktion aufgerufen. Es wird also anscheinend eine willkürliche SIGNAL-SLOT-Verbindung hergestellt.

Wenn ich nun die Seiten-ui nicht als Seite vom Qtabwidget aufrufe, sondern für sich alleine,ist alles normal!
Und dann habe ich noch andere, ähnliche Seiten-ui's, die spinnen nicht, auch wenn sie Teil vom Qtabwidget sind.

Ich werde (recht bald) Alles löschen und neu machen, wohler wäre mir, wenn ich zuvor eine Erklärung fände:
Irgendwo muss doch die doubleSpinBox mit der pushbutton-Funktion verknüpft sein - kann man das irgendwo finden?
Mit der erweiterten Suche finde ich jedenfalls nichts (außer den erwarteten Einträgen in der h und cpp)

LG
Chri
Die Sprache des Technikers ist die Skizze
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

Re: Qt zuverlässig???

Beitrag von Chri »

Nachdem ich meinen letzten Beitrag gelesen habe, ist mir die Idee gekommen, die Seiten des tabWiget mittels Code einzufügen.
Doch beim Ausführen stürzt das Programm ab.
Da das wahrscheinlich ein anderes Problem ist, habe ich diese Frage im Forum QT Programmierung gestellt.

LG
Chri
Die Sprache des Technikers ist die Skizze
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

Re: Qt zuverlässig???

Beitrag von Chri »

Habe nun die Seite mittels Code eingefügt. ->insertTab(.....)
Und jetzt funktioniert es ohne Probleme.
(Das Problem beim codemäßigen Einfügen der Seiten war mein Fehler)

QT bietet an, die Seiten im Creator einzufügen, davon möchte ich dringend abraten.
Ich hatte Glück, dass sich der Fehler so auswirkte, dass es mir auffiel.
Wenn etwas angeboten wird, was still und heimlich zu falschen Ergebnissen führen kann, kann ich nur sagen:
QT ist nicht zuverlässig.... hoffentlich gibt's keine weiteren bösen Überraschungen.

LG
Chri
Die Sprache des Technikers ist die Skizze
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Qt zuverlässig???

Beitrag von Christian81 »

Nur weil Du vergisst setupUi aufzurufen bevor du auf die Variablen zugreifst ist Qt unzuverlässig? Das nenne ich Logik... :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

Re: Qt zuverlässig???

Beitrag von Chri »

Nein, nicht wegen setupUi.
Das war mein Fehler, ist klar und nachvollziehbar.
Das habe ich auch in meinem vorherigen Beitrag geschrieben!

Aber die andere Sache:
QT bietet im Creator an, mittels re Maustaste Seiten einzufügen (Müsste ja nicht angeboten werden!)
Funktioniert oft, aber in einem Fall eben nicht, aus nicht nachvollziehbaren Gründen und das
führte nicht zu einem Absturz etc. sondern ganz einfach zu einem falschen Ergebnis.

Und DAS ist unzuverlässig.
So als würde in Excel mit =A1+A2 meistens das Richtige rauskommen und manchmal nicht.

LG
Chri
Die Sprache des Technikers ist die Skizze
Volker75
Beiträge: 59
Registriert: 8. April 2009 21:04

Re: Qt zuverlässig???

Beitrag von Volker75 »

Aus meinen Erfahrungen kann ich sagen: Qt ist genau so (un)-zuverlässig wie Excel oder nahezu jedes andere größere Softwarepaket (vom Compiler, Betriebsystem, Office, ...).
Schon mal in die Changelogs, Bugtracker, Known Bugs Listen, ... von Excel, Qt, ggc, clang, ... geguckt? Bei so großen Projekten gibt es oft mehr als eine Handvoll bekannter Fehler bzw. Unzuverlässigkeiten. Warum wohl Microsoft, Apple, ... immer Updates heruasbringen? Also nur neue Funktionen sind das nicht. Sehr oft werden dort unzuverlässigkeiten gefixt.
Ich schätze, dass 99,99999...% aller Nutzer solche Unzuverlässigkeiten nie merken, weil:
- es sehr selten auftritt
oder (falls häufig auftritt)
- die Programmierer ein Workaround geschrieben haben.
oder
- der Fehler mit der nächsten Version gefixt wurde

Wichtig ist: Wenn man Fehler entdeckt, dann muss man sie melden! Sonst wird es immer unzuverlässig bleiben. Also bitte bei https://bugreports.qt.io/secure/Dashboard.jspa eintragen. Am schönsten wäre es natürlich, dass man dem Qt-Projekt auch etwas zurückgibt, wenn man deren Software kostenlos benutzt (also z.B. den Fehler selbst lokalisiert und fixed). (Wäre sonst so wie auf einer Feier kostenlos eingeladen zu sein, kostenlos Essen, tricken, Tanzen, ... und sich dann über einen (kleinen) Fehler zu beschweren). Falls man zahlender Kunde ist, dann kümmern sich die Jungs aber bestimmt auch bevorzugt um solche Fehler.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Qt zuverlässig???

Beitrag von Christian81 »

Chri hat geschrieben: 25. Februar 2018 13:23 Aber die andere Sache:
QT bietet im Creator an, mittels re Maustaste Seiten einzufügen (Müsste ja nicht angeboten werden!)
Funktioniert oft, aber in einem Fall eben nicht, aus nicht nachvollziehbaren Gründen und das
führte nicht zu einem Absturz etc. sondern ganz einfach zu einem falschen Ergebnis.
1. ist Qt != QtCreator - die beiden Projekte sind unabhängig voneinander
2, Wo ist der zugehörige Bugreport?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten