Seite 1 von 1

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

Verfasst: 11. August 2009 19:52
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ß

Verfasst: 11. August 2009 20:07
von upsala
Schalte den QSignalMapper dazwischen

Verfasst: 11. August 2009 20:30
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ß

Verfasst: 11. August 2009 20:52
von upsala
Fehlerausgabe auf der Konsole?
Button mit dem Timer verbunden?
qDebug() funktioniert auch nicht?

Verfasst: 11. August 2009 21:13
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");

Verfasst: 12. August 2009 17:14
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ß

Verfasst: 12. August 2009 18:51
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?

Verfasst: 12. August 2009 19:09
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.

Verfasst: 12. August 2009 20:00
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?

Verfasst: 13. August 2009 18:30
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...