Problem mit eigenem Slot

Alles rund um die Programmierung mit Qt
Antworten
mh1977
Beiträge: 14
Registriert: 29. März 2009 22:23

Problem mit eigenem Slot

Beitrag von mh1977 »

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;
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn connect() einen Pointer möchte, solltest Du ihn auch einen geben und kein Objekt - C++ Basics.

Benutze außerdem bitte die

Code: Alles auswählen

 - Tags - den Code kann so keiner wirklich esen!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Und bevor hier noch ein Anfänger durchsurft und sich den Code zum Serialport abschaut folgender Tipp: http://qextserialport.sourceforge.net/
Antworten