Forum: PC-Programmierung QT PushButton


von David S. (eledave)


Lesenswert?

Hallo zusammen!

Könnte mir vielleicht jemand mal erläutern, wie ich den Befehl

"void xxx::on_pushButton_clicked()"

richtig benutze?
Der Plan ist, beim Klicken des Buttons eine Verbindung zu einer 
seriellen Schnittstelle herzustellen.

Hatte es so mal versucht,

void com_2::on_pushButton_6_clicked(QPushButton *event1)
{
    if(QPushButton::clicked())
    {
        event1->accept();
        QSerialPort serial;
        serial.setPortName("COM3");
        serial.setBaudRate(QSerialPort::Baud9600);
        serial.setDataBits(QSerialPort::Data8);
        serial.setStopBits(QSerialPort::TwoStop);
        serial.setParity(QSerialPort::NoParity);
        serial.setFlowControl(QSerialPort::NoFlowControl);
        serial.open(QIODevice::ReadWrite);
    }
    else
    {
        event1->ignore();
    }
}

allerdings kommt dasnn folgende Fehlermeldung:

Fehler: cannot call member function 'void 
QAbstractButton::clicked(bool)' without object
     if(QPushButton::clicked())
                             ^

Im Voraus schonmal danke!

von Noch einer (Gast)


Lesenswert?

Woher soll der Compiler wissen, welchen QPushButton du abfragen 
möchtest?

Unten benutzt du event1->accept(). Warum nicht auch event1->clicked() ?

von David S. (eledave)


Lesenswert?

Wo und wie genau meinst du das jetzt?
als bedingung für die if-Schleife oder in der Schleife selbst?

ich weiß nicht, ob meine Programm-Struktur für mein Vorhaben überhaupt 
richig ist...

von Planlos (Gast)


Lesenswert?

(Ich gehe davon aus, du willst einen Toggle-Button, den man mit einem 
Klick anschaltet, und mit dem nächsten Klick wieder ausschaltet, 
korrekt?)

Schritt 1: Gib der Methode einen vernünftigen Namen:

void MeinObject::open_or_close_serial_connection(bool requestedState)

Schritt 2: Definiere (klickibunti) im Designer, dass dein Button beim 
Drücken diese Funktion (Slot) aufrufen soll, in dem du das SIGNAL 
clicked(bool checked = false) mit deinem SLOT verbindest.

von Oliver S. (oliverso)


Lesenswert?

zu Qt gibt es sehr ausführliche Beispiele und auch Tutorials. Da wird 
die erforderliche Programmstruktur gut erklärt.

Nur so als Beispiel:

https://qtvon0auf100.wordpress.com/

Oliver

von Noch einer (Gast)


Lesenswert?

> als bedingung für die if-Schleife oder in der Schleife selbst?

Überall. Dieses Problem hat mit Qt nichts zu tun. Ist ein reines C++ 
Problem.

- Statische Methoden rufst du mit Klassennname::Methodenname() auf.
- Normale Methoden mit Variable.Methodenname() bzw. 
Zeiger->Methodenname()

> ich weiß nicht

Nicht so wild. Wenn du dir zu viel auf einmal vorgenommen hast, mach es 
halt in mehreren Schritten. Erst mal ein paar Tutorials durcharbeiten, 
danach die Struktur für dein Programm entwerfen.

von Karl Käfer (Gast)


Lesenswert?

David S. schrieb:
> Könnte mir vielleicht jemand mal erläutern, wie ich den Befehl
>
> "void xxx::on_pushButton_clicked()"
>
> richtig benutze?

https://de.wikibooks.org/wiki/Qt_f%C3%BCr_C%2B%2B_Anf%C3%A4nger:_Signale_und_Slots

http://doc.qt.io/qt-4.8/signalsandslots.html

http://doc.qt.io/qt-5/signalsandslots.html

von Sven B. (scummos)


Lesenswert?

clicked() ist kein Member den du aufrufen kannst, werder abstrakt noch 
konkret. Es ist ein Signal. Lies die Doku, das ist wirklich überall gut 
erklärt.

von Schleiferich (Gast)


Lesenswert?

David S. schrieb:
> als bedingung für die if-Schleife oder in der Schleife selbst?

Und natürlich zu guter Letzt wirf bitte einen Blick auf
http://www.if-schleife.de/

von Mathias O. (m-obi)


Lesenswert?

Hast du die Funktion selber angelegt und machst es über connect?

Oder hast du es über den Designer erstellen lassen (Rechtsklick -> Slot 
anzeigen) und dort clicked (das Normale ohne bool) ausgewählt?

Normalerweise müsste es so aussehen:
void com_2::on_pushButton_6_clicked()
{
    QSerialPort serial;
    serial.setPortName("COM3");
    serial.setBaudRate(QSerialPort::Baud9600);
    serial.setDataBits(QSerialPort::Data8);
    serial.setStopBits(QSerialPort::TwoStop);
    serial.setParity(QSerialPort::NoParity);
    serial.setFlowControl(QSerialPort::NoFlowControl);
    serial.open(QIODevice::ReadWrite);
}

Ich würde serial global machen. Du willst ja auch bestimmt drauf 
zugreifen zum schreiben oder lesen.

von David S. (eledave)


Lesenswert?

Melde mich leider erst nach einer längeren Pause!

Vielen Dank Euch, insbesondere Mathias O., habe es hinbekommen :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.