Problem mit eigenem Slot
Verfasst: 29. März 2009 22:35
Hallo,
meine erste Übung in QT4 sollte sein, dass ich mit einem schieberegler den wert an die serielle schnittstelle schicke. ich habe aber probleme diese Funktion in einer QT-Klasse richtig zu beschreiben. Es ist reduziert auf eine Fehlermeldung, die ich nicht verstehe:
src/main.cpp:92: Fehler: keine passende Funktion für Aufruf von »QObject::connect(QSlider*&, const char [16], Seriell&, const char [9])«
/usr/include/qt4/QtCore/qobject.h:197: Anmerkung: Kandidaten sind: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:302: Anmerkung: bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
Der Quellcode:
#include <QApplication>
//#include "dialogimpl.h"
#include <QVBoxLayout>
#include <QSpinBox>
#include <QSlider>
#include <QObject>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <cstring>
#include <fstream>
#include <iostream>
#include <iomanip> //für setwd
#include <ctime>
#include <unistd.h>
#include <sys/ioctl.h>
using namespace std;
void open_ser(void);
int fd,c, res;
struct termios oldtio,newtio;
/* baudrate settings are defined in <asm/termbits.h>, which is
included by <termios.h> */
#define BAUDRATE B38400
/* change this definition for the correct port */
#define MODEMDEVICE "/dev/ttyS2"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
class Seriell:public QObject{
Q_OBJECT
public:
Seriell(QObject *parent=0);
//char senden();
void event(){
senden();
}
signals:
void valueChanged(int);
public slots:
void senden();
};
void Seriell::senden()
{
char Out[20];
//int a;
ofstream schreiben(MODEMDEVICE);
strcat(Out,"hallo");//"20=5!'\13'");
schreiben.write(Out,strlen(Out));
}
//
int main(int argc, char *argv[])
{
Seriell test;
open_ser();
QApplication app( argc, argv );
QWidget* win =new QWidget;
QVBoxLayout* layout=new QVBoxLayout(win);
QSpinBox* spin =new QSpinBox;
QSlider* slider =new QSlider(Qt::Horizontal);
//Minimum-Maximum Wert für Spinbox
spin->setMinimum(0);
spin->setMaximum(10);
//Minimum-Maximum Wert für Slider
slider->setMinimum(0);
slider->setMaximum(10);
//Widgets hinzufügen
layout->addWidget(spin);
layout->addWidget(slider);
//Signal- und Slot Verbindung
QObject::connect(spin,SIGNAL(valueChanged(int)),
slider,SLOT(setValue(int)));
QObject::connect(slider,SIGNAL(valueChanged()),
test,SLOT(event()));
win->show();
return app.exec();
}
void open_ser()
{
/*
Open modem device for reading and writing and not as controlling tty
because we don't want to get killed if linenoise sends CTRL-C.
*/
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {perror(MODEMDEVICE); exit(-1); }
fd_set readfs; /* file descriptor set */
tcgetattr(fd,&oldtio); /* save current serial port settings */
bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */
/*
BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed.
CRTSCTS : output hardware flow control (only used if the cable has
all necessary lines. See sect. 7 of Serial-HOWTO)
CS8 : 8n1 (8bit,no parity,1 stopbit)
CLOCAL : local connection, no modem contol
CREAD : enable receiving characters
*/
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
/*
IGNPAR : ignore bytes with parity errors
ICRNL : map CR to NL (otherwise a CR input on the other computer
will not terminate input)
otherwise make device raw (no other input processing)
*/
newtio.c_iflag = IGNPAR | ICRNL;
/*
Raw output.
*/
newtio.c_oflag = 0;
/*
ICANON : enable canonical input
disable all echo functionality, and don't send signals to calling program
*/
newtio.c_lflag = ICANON;
/*
initialize all control characters
default values can be found in /usr/include/termios.h, and are given
in the comments, but we don't need them here
*/
newtio.c_cc[VINTR] = 0; /* Ctrl-c */
newtio.c_cc[VQUIT] = 0; /* Ctrl-\ */
newtio.c_cc[VERASE] = 0; /* del */
newtio.c_cc[VKILL] = 0; /* @ */
newtio.c_cc[VEOF] = 4; /* Ctrl-d */
newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
newtio.c_cc[VMIN] = 1; /* blocking read until 1 character arrives */
newtio.c_cc[VSWTC] = 0; /* '\0' */
newtio.c_cc[VSTART] = 0; /* Ctrl-q */
newtio.c_cc[VSTOP] = 0; /* Ctrl-s */
newtio.c_cc[VSUSP] = 0; /* Ctrl-z */
newtio.c_cc[VEOL] = 0; /* '\0' */
newtio.c_cc[VREPRINT] = 0; /* Ctrl-r */
newtio.c_cc[VDISCARD] = 0; /* Ctrl-u */
newtio.c_cc[VWERASE] = 0; /* Ctrl-w */
newtio.c_cc[VLNEXT] = 0; /* Ctrl-v */
newtio.c_cc[VEOL2] = 0; /* '\0' */
/*
now clean the modem line and activate the settings for the port
*/
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
/*
terminal settings done, now handle input
*/
return;
}
meine erste Übung in QT4 sollte sein, dass ich mit einem schieberegler den wert an die serielle schnittstelle schicke. ich habe aber probleme diese Funktion in einer QT-Klasse richtig zu beschreiben. Es ist reduziert auf eine Fehlermeldung, die ich nicht verstehe:
src/main.cpp:92: Fehler: keine passende Funktion für Aufruf von »QObject::connect(QSlider*&, const char [16], Seriell&, const char [9])«
/usr/include/qt4/QtCore/qobject.h:197: Anmerkung: Kandidaten sind: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:302: Anmerkung: bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
Der Quellcode:
#include <QApplication>
//#include "dialogimpl.h"
#include <QVBoxLayout>
#include <QSpinBox>
#include <QSlider>
#include <QObject>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <cstring>
#include <fstream>
#include <iostream>
#include <iomanip> //für setwd
#include <ctime>
#include <unistd.h>
#include <sys/ioctl.h>
using namespace std;
void open_ser(void);
int fd,c, res;
struct termios oldtio,newtio;
/* baudrate settings are defined in <asm/termbits.h>, which is
included by <termios.h> */
#define BAUDRATE B38400
/* change this definition for the correct port */
#define MODEMDEVICE "/dev/ttyS2"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
class Seriell:public QObject{
Q_OBJECT
public:
Seriell(QObject *parent=0);
//char senden();
void event(){
senden();
}
signals:
void valueChanged(int);
public slots:
void senden();
};
void Seriell::senden()
{
char Out[20];
//int a;
ofstream schreiben(MODEMDEVICE);
strcat(Out,"hallo");//"20=5!'\13'");
schreiben.write(Out,strlen(Out));
}
//
int main(int argc, char *argv[])
{
Seriell test;
open_ser();
QApplication app( argc, argv );
QWidget* win =new QWidget;
QVBoxLayout* layout=new QVBoxLayout(win);
QSpinBox* spin =new QSpinBox;
QSlider* slider =new QSlider(Qt::Horizontal);
//Minimum-Maximum Wert für Spinbox
spin->setMinimum(0);
spin->setMaximum(10);
//Minimum-Maximum Wert für Slider
slider->setMinimum(0);
slider->setMaximum(10);
//Widgets hinzufügen
layout->addWidget(spin);
layout->addWidget(slider);
//Signal- und Slot Verbindung
QObject::connect(spin,SIGNAL(valueChanged(int)),
slider,SLOT(setValue(int)));
QObject::connect(slider,SIGNAL(valueChanged()),
test,SLOT(event()));
win->show();
return app.exec();
}
void open_ser()
{
/*
Open modem device for reading and writing and not as controlling tty
because we don't want to get killed if linenoise sends CTRL-C.
*/
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {perror(MODEMDEVICE); exit(-1); }
fd_set readfs; /* file descriptor set */
tcgetattr(fd,&oldtio); /* save current serial port settings */
bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */
/*
BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed.
CRTSCTS : output hardware flow control (only used if the cable has
all necessary lines. See sect. 7 of Serial-HOWTO)
CS8 : 8n1 (8bit,no parity,1 stopbit)
CLOCAL : local connection, no modem contol
CREAD : enable receiving characters
*/
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
/*
IGNPAR : ignore bytes with parity errors
ICRNL : map CR to NL (otherwise a CR input on the other computer
will not terminate input)
otherwise make device raw (no other input processing)
*/
newtio.c_iflag = IGNPAR | ICRNL;
/*
Raw output.
*/
newtio.c_oflag = 0;
/*
ICANON : enable canonical input
disable all echo functionality, and don't send signals to calling program
*/
newtio.c_lflag = ICANON;
/*
initialize all control characters
default values can be found in /usr/include/termios.h, and are given
in the comments, but we don't need them here
*/
newtio.c_cc[VINTR] = 0; /* Ctrl-c */
newtio.c_cc[VQUIT] = 0; /* Ctrl-\ */
newtio.c_cc[VERASE] = 0; /* del */
newtio.c_cc[VKILL] = 0; /* @ */
newtio.c_cc[VEOF] = 4; /* Ctrl-d */
newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
newtio.c_cc[VMIN] = 1; /* blocking read until 1 character arrives */
newtio.c_cc[VSWTC] = 0; /* '\0' */
newtio.c_cc[VSTART] = 0; /* Ctrl-q */
newtio.c_cc[VSTOP] = 0; /* Ctrl-s */
newtio.c_cc[VSUSP] = 0; /* Ctrl-z */
newtio.c_cc[VEOL] = 0; /* '\0' */
newtio.c_cc[VREPRINT] = 0; /* Ctrl-r */
newtio.c_cc[VDISCARD] = 0; /* Ctrl-u */
newtio.c_cc[VWERASE] = 0; /* Ctrl-w */
newtio.c_cc[VLNEXT] = 0; /* Ctrl-v */
newtio.c_cc[VEOL2] = 0; /* '\0' */
/*
now clean the modem line and activate the settings for the port
*/
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
/*
terminal settings done, now handle input
*/
return;
}