Button im zweiten Fenster führt Funktion im ersten Fenster aus

Alles rund um die Programmierung mit Qt
Antworten
rs_freak93
Beiträge: 4
Registriert: 8. September 2018 20:55

Button im zweiten Fenster führt Funktion im ersten Fenster aus

Beitrag von rs_freak93 »

Hallo,
es wäre schön, wenn mich jemand bei meinen Problem unterstützen könnte.
Ich würde gern durch das Bestätigen eines Button in einem zweiten Fenster(QDialog) eine Funktion ausführen, die mir im ersten Fenster in ein QListWidget schreibt.
main.cpp

Code: Alles auswählen

#include <QApplication>
#include <QPushButton>
#include <QLayout>
#include <QTextEdit>
#include <QMessageBox>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;
    w.show();

    //connect(, SecDia::on_ButtonOk_clicked())
    //test();

    return a.exec();
}
mainwindow.cpp

Code: Alles auswählen

#include "mainwindow.h"
#include "secdia.h"
#include "ui_mainwindow.h"
#include "ui_secdia.h"
#include <QMessageBox>
#include <QLabel>
#include <QPushButton>


static int i = 0;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui->setupUi(this);
    //connect(ui->cmdHallo, SIGNAL(clicked()), this, SLOT(test()));
    connect(sec->ButtonOk, SIGNAL(clicked()), this, SLOT(test()));
}

MainWindow::~MainWindow()
{
    delete ui;

}

void MainWindow::on_cmdHallo_clicked()
{
    //QMessageBox *myMessageBox=new QMessageBox(this);
   // myMessageBox->setText("Hallo Welt");
    //myMessageBox->show();

    ui->lblText->setText("Hello");


}

void MainWindow::on_actionBeenden_triggered()
{
    this->close();
}

void MainWindow::on_actionNeu_triggered()
{


    // test();
    sec = new SecDia(this);
    sec->show();
}

void MainWindow::test()
{

    ui->listWidget->addItem(QString::number(i));
    i++;
}
mainwindow.h

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSignalMapper>
#include "secdia.h"
#include "ui_mainwindow.h"
#include "ui_secdia.h"
#include <QPushButton>


class QPushButton;

class SecDia;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


private slots:
    void on_actionBeenden_triggered();

    void on_actionNeu_triggered();

    void on_cmdHallo_clicked();

public slots:
    void test();

private:
    Ui::MainWindow *ui;
    SecDia *sec;




};

#endif // MAINWINDOW_H
secdia.cpp

Code: Alles auswählen

#include "secdia.h"
#include "ui_secdia.h"
#include "mainwindow.h"
#include <QMessageBox>
#include <QLabel>
#include <QPushButton>



SecDia::SecDia(QWidget *parent) :
    QDialog(parent),
    sec(new Ui::SecDia)
{
    sec->setupUi(this);

    connect(sec->ButtonOk, SIGNAL(clicked()), this, SLOT(test()));
}

SecDia::~SecDia()
{
    delete sec;
}

void SecDia::on_ButtonAbbrechen_2_clicked()
{
    this->close();
}

void SecDia::on_ButtonOk_clicked()
{
    this->close();


}
secdia.h

Code: Alles auswählen

#ifndef SECDIA_H
#define SECDIA_H


#include "ui_secdia.h"
#include <QDialog>

class QPushButton;

class MainWindow;

namespace Ui {
class SecDia;

}

class SecDia : public QDialog
{
    Q_OBJECT

public:
    explicit SecDia(QWidget *parent = nullptr);
    ~SecDia();


private slots:
    void on_ButtonAbbrechen_2_clicked();

public slots:
    void on_ButtonOk_clicked();

private:
    Ui::SecDia *sec;

};

#endif // SECDIA_H
Mein Ansatz ist in der mainwindow.cpp dargestellt. Ich hatte versucht das Signal des ButtonOk aus dem zweiten Fenster herauszufiltern. Das Problem ist, dass das erste Fenster diesen Button nicht erkennt.

Ich hoffe ihr könnt mir weiter helfen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Button im zweiten Fenster führt Funktion im ersten Fenster aus

Beitrag von Christian81 »

Die Klasse SecDia muss ein Singal emitten welches Du dann in der Hauptklasse verbinden kannst.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
rs_freak93
Beiträge: 4
Registriert: 8. September 2018 20:55

Re: Button im zweiten Fenster führt Funktion im ersten Fenster aus

Beitrag von rs_freak93 »

Danke für deinen Rat. Könntest du mir verraten, wie das in etwa auszusehen hat? Ich bin noch recht neu in der Qt-Welt.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Button im zweiten Fenster führt Funktion im ersten Fenster aus

Beitrag von Christian81 »

Die Qt-Doku sagt dazu eigentlich recht viel: http://doc.qt.io/qt-5/signalsandslots.h ... al-example
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
rs_freak93
Beiträge: 4
Registriert: 8. September 2018 20:55

Re: Button im zweiten Fenster führt Funktion im ersten Fenster aus

Beitrag von rs_freak93 »

Ich hatte mir die Dokumentation schon einmal angesehen, nur leider werde ich daraus nicht schlau. Ein Signal wird jetzt vom click des Button emittert. Jedoch wird die Funktion nicht ausgeführt.

Code: Alles auswählen

connect(sec, &SecDia::sigOkPressed, this, &MainWindow::test);
sigOkPressed ist hierbei das emittierte Signal welches in der Funktion on_ButtonOk_clicked() untergebracht ist:

Code: Alles auswählen

void SecDia::on_ButtonOk_clicked()
{
    emit sigOkPressed();

    this->close();
}
Diese Funktion wiederum ist in der Header secdia.h in der Klasse SecDia wie folgt definiert.

Code: Alles auswählen

signals:
     void sigOkPressed();
     
Ist das soweit richtig? Es gibt jetzt keine Fehlermeldung und das Programm wird gestartet, allerdings wird die Funktion test() nicht ausgefüht.
rs_freak93
Beiträge: 4
Registriert: 8. September 2018 20:55

Re: Button im zweiten Fenster führt Funktion im ersten Fenster aus

Beitrag von rs_freak93 »

Ok ich habe es hinbekommen in dem ich die erwähnte Funktion folgender Maßen einfügte:

Code: Alles auswählen

void MainWindow::on_actionNeu_triggered()
{


    // test();
    sec = new SecDia(this);
    
    connect(sec, &SecDia::sigOkPressed, this, &MainWindow::test);
    
    sec->show();
}
freakonaleash99
Beiträge: 43
Registriert: 23. Juli 2017 12:35

Re: Button im zweiten Fenster führt Funktion im ersten Fenster aus

Beitrag von freakonaleash99 »

Habe gerade ein sehr ähnliches Problem, daher möchte ich das hier gerne anhängen.

Ich möchte mir einen Dialog ("Settings") erstellen, in dem man für mein MainWindow alle Einstellungen treffen kann, also Hintergrundfarbe, Schriftfarbe, Farbe von einzelnen Textfeldern. Die Farben kann man alle separat im Dialog auswählen über QColorDialog. Das Problem ist jetzt, dass ich über einen "anwenden"-Button nicht nur eine Funktion im MainWindow ausführen muss, welche die Stylesheets ändert, sondern natürlich auch irgendwie die Farben in diese auszuführende Funktion in MainWindow überträgt.

Hat da jemand einen entscheidenden Hinweis wie ich das am besten realisiere?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Button im zweiten Fenster führt Funktion im ersten Fenster aus

Beitrag von Christian81 »

Anwenden-Button mit einem Slot verbinden, in dem Slot ein Signal senden welches die neuen Einstellungen hat.
Dieses Signal vorher im MainWindow mit einem Slot im MainWindow verbinden und dort dann die Änderungen ausführen.
Siehe http://doc.qt.io/qt-5/signalsandslots.html
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
freakonaleash99
Beiträge: 43
Registriert: 23. Juli 2017 12:35

Re: Button im zweiten Fenster führt Funktion im ersten Fenster aus

Beitrag von freakonaleash99 »

Danke, die Doku war mir natürlich schon bekannt. Aber ich hatte einen Denkfehler der sich über Nacht nun aber von selbst gelöst hat XD. Das mit den Signalen und Slots ist auch für mich neu, aber gefällt mir bisher.

Ich habe nun allerdings schon wieder ein Problem. Ich habe eine eigene Klasse erstellt in der ich ein Signal mit einem Slot verbinden möchte.
Hier der Quelltext:
style_color.h

Code: Alles auswählen

#ifndef STYLE_COLOR_H
#define STYLE_COLOR_H
#include <QColorDialog>
#include <QColor>
#include <QObject>

class style_color:public QObject
{
public:
    style_color();

    QString getrgbString();

private slots:
    void color_selection(QColor col);

signals:
    void currentcolor(QColor col);
};

#endif // STYLE_COLOR_H
style_color.cpp

Code: Alles auswählen

#include "style_color.h"
#include <QDebug>

style_color::style_color()
{

}

QString style_color::getrgbString()
{
    QColorDialog *color = new QColorDialog;
    connect(color,SIGNAL(colorSelected(QColor)),this,SLOT(color_selection(QColor)));
    
    //Folgendes nicht wirklich relevant für das Problem
    QColor col;
    col = color->getColor().toRgb();
    QString red=QString::number(col.red());
    QString green=QString::number(col.green());
    QString blue=QString::number(col.blue());
    QString style = "rgb("+red+","+green+","+blue+");";

    return style;
}

void style_color::color_selection(QColor col)
{
    qDebug()<<"funktioniert";
}
Bei der Ausführung tritt folgender Fehler auf:
"QObject::connect: No such slot QObject::color_selection(QColor)"

Ich verstehe nicht ganz, warum das mit dem Slot nicht ganz passt. Mit "this" zeige ich doch auf die style_color Klasse oder nicht? Und nicht auf die Elternklasse?


Ergänzung: Hier (https://stackoverflow.com/questions/382 ... -own-class) wurde ein ähnliches Problem behandelt, welches mich aber nicht weiterbringt. Es wird beschrieben, dass "Q_OBJECT" noch in der Klassendeklaration hinzugefügt werden soll. Das führt bei mir dann wiederum zum Fehler: "symbol(s) not found for architecture x86_64"
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Button im zweiten Fenster führt Funktion im ersten Fenster aus

Beitrag von Christian81 »

Q_OBJECT im Header vergessen, danach alles neu kompilieren (und auch qmake neu ausführen).
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten