Wie QTimer bei timeout() auf Funktion(int) zeigen lassen?

Alles rund um die Programmierung mit Qt
Antworten
knallo
Beiträge: 9
Registriert: 11. August 2009 17:01

Wie QTimer bei timeout() auf Funktion(int) zeigen lassen?

Beitrag von knallo »

Hallo zusammen!

Ich bin neu in der Programmierung mit Qt, und habe da erstmal ein paar Fragen zur Nutzung der Timer und einer davon aufgerufenen Funktion.

Auf meiner Form befinden sich 6 Buttons, jeder dieser Buttons soll einen QTimer starten.
Nach Ablauf eines Timers soll eine Funktion mit einem Parameter vom Typ 'int' aufgerufen werden.
Allerdings gelingt es mir nicht für alle sechs Timer eine gemeinsame Funktion (programm_starten(int iNr))zu nutzen, die nach dem timeout()-Ereignis aufgerufen werden soll.
Momentan habe ich diese Funktion halt 6x, nur mit verschiedenem Namen und ohne Übergabeparameter - nicht schön, und noch weniger effizient...

Im Konstruktor mache ich momentan folgendes:

Code: Alles auswählen

timer_1 = new QTimer(this);
timer_2 = new QTimer(this);
// ... (6 Timer)
connect(timer_1,SIGNAL(timeout()),this,SLOT(programm_starten_1()));
connect(timer_2,SIGNAL(timeout()),this,SLOT(programm_starten_2()));
// ... (6 connects)
Wie kann ich von allen sechs Timern bei Ablauf ein und die selbe Funktion, dafür aber mit einem integer-Parameter aufrufen?

Hilfe ist willkommen!

Gruß
<QtCreator 4.5>
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Schalte den QSignalMapper dazwischen
knallo
Beiträge: 9
Registriert: 11. August 2009 17:01

Beitrag von knallo »

Das hab ich schon versucht, aber da wird meine Funktion nicht aufgerufen. Bei den ui-Elementen habe ich auch mappings verwendet, die laufen. Aber hier das... - keine Ahnung warum nicht.

Hier mal der Code, vielleicht seht ihr den Fehler?

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{  // {...}
    timer_1 = new QTimer(this);
    QSignalMapper *myMapper = new QSignalMapper(this);
    connect(timer_1,SIGNAL(timeout()),myMapper,SLOT(map()));
    myMapper->setMapping(timer_1,1);
    connect(myMapper,SIGNAL(mapped(int)),this,SLOT(programm_starten(int)));

void MainWindow::programm_starten(int iNummer)
{  //...}
In den Funktionen habe ich MessageBoxes, die bei Aufruf der Funktion kämen, um den Aufruf zu erkennen - die erscheinen aber nicht. Also komme ich in die Funktion mit dem int-Parameter nicht rein.

By the way:
Schöner wäre es herauszufinden, wenn ich debuggen könnte... Aber Haltepunkte werden ignoriert, ich bekomme wenn ich F5 drücke noch nichtmal die GUI zu sehen. Habt ihr da auch ne Idee

Gruß
<QtCreator 4.5>
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Fehlerausgabe auf der Konsole?
Button mit dem Timer verbunden?
qDebug() funktioniert auch nicht?
knallo
Beiträge: 9
Registriert: 11. August 2009 17:01

Beitrag von knallo »

Die Konsole ist die unten liegende Schaltfläche "Ausgabe der Anwendung"??
Da steht nichts.

Der Timer wird in der ButtonClick-Funktion gestartet. Das funktioniert ja auch, abre NUR wenn ich den connect wie im ersten Beitrag beschrieben mache - also auf eine Funktion ohne Übergabeparameter (und somit ohne Nutzung des Mappings) schicke.

Das qDebug kann ich zwar reinschreiben, der Compiler meckert auch nicht, aber den Text finde ich nirgendwo. :(

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
qDebug("test");
<QtCreator 4.5>
knallo
Beiträge: 9
Registriert: 11. August 2009 17:01

Beitrag von knallo »

Ich habs jetzt nochmal weiter probiert mit dem Debuggen, wenn ich mit Strg+R starte ("Ausführen"), dann kann ich die Texte von qDebug() sehen.
Aber warum die Haltepunkte beim Debuggen (F5) ignoriert werden und keine GUI kommt, hab ich noch nicht rausgefunden... :(

Wie sieht es mit Vorschlägen für mein Timer-Problem aus, hat da noch jemand weitere Ideen?


Gruß
<QtCreator 4.5>
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

knallo hat geschrieben: Wie sieht es mit Vorschlägen für mein Timer-Problem aus, hat da noch jemand weitere Ideen?
aber den Timer startest du schon noch irgendwo ... oder?
knallo
Beiträge: 9
Registriert: 11. August 2009 17:01

Beitrag von knallo »

Ja, den starte ich.
Nehme ich für sechs timer sechs eigene Funktionen (ohne Parameter) gehts.
Nur mit meiner gewünschten Funktion (mit Parameter) gehts nicht, die wird nie aufgerufen.
<QtCreator 4.5>
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Einfacher kann ich's nicht machen:

Code: Alles auswählen

----
#ifndef _TESTER_
#define _TESTER_
#include <QSignalMapper>
#include <QTimer>
class Tester : public QObject
{
  Q_OBJECT
  public:
    Tester();
  private slots:
    void programm_starten(int);
};
#endif
----
#include <QDebug>
#include "test.h"

Tester::Tester()
{
  QTimer *timer = new QTimer(this);
  QSignalMapper *myMapper = new QSignalMapper(this);
  connect(timer,SIGNAL(timeout()),myMapper,SLOT(map()));
  myMapper->setMapping(timer,23);
  connect(myMapper,SIGNAL(mapped(int)),this,SLOT(programm_starten(int)));
  timer->start(500);
} 
    
void Tester::programm_starten(int value)
{
  qDebug() << value;
}
-----
#include <QCoreApplication>
#include "test.h"
  
int main(int argc, char *argv[]) {
  QCoreApplication  app(argc,argv);
  Tester t;
  return app.exec();   
} 
----
Das funktioniert. Wo liegt der Unterschied zu deinem Code?
knallo
Beiträge: 9
Registriert: 11. August 2009 17:01

Beitrag von knallo »

Das Mapping sieht bei dir aus wie bei mir (siehe weiter oben), das verstehe ich jetzt nicht.
Hat meine Installation vielleicht nen Knall? Debuggen geht ja auch nicht...
<QtCreator 4.5>
Antworten