mousePressEvent + Zugriff auf Widgets



  • Guten Tag,

    ich habe folgendes Problem:
    Ich möchte auf einen Klick mit der Maus auf ein LineEdit-Widget reagieren. Und zwar soll wenn das LineEdit-Widget angeklickt wurde, der Text eines Labels welches ich mit dem Qt Designer erstellt habe verändert werden.

    So weit ich herausgefunden habe, muss ich zuerst eine eigene Klasse erstellen die von QLineEdit abgeleitet ist um dann die Methode mousePressEvent(QMouseEvent 😉 zu überschreiben. So weit habe ich es schon hinbekommen.

    Nur leider bekomme ich es nicht hin, in der Methode mousePressEvent() den Text des Labels zu verändern, da ui in der Klasse nicht bekannt ist.

    meinLineEdit.h:
    [code="cpp"]
    #ifndef MEINLINEEDIT_H
    #define MEINLINEEDIT_H
    #include <QLineEdit>
    #include <QMouseEvent>

    class meinLineEdit:public QLineEdit
    {
    public:
    meinLineEdit(QWidget *eltern);
    void mousePressEvent(QMouseEvent *event);
    };

    #endif // MEINLINEEDIT_H
    [/code]

    meinLineEdit.cpp:
    [code="cpp"]
    #include "meinLineEdit.h"
    #include <QMouseEvent>

    meinLineEdit::meinLineEdit(QWidget *eltern):QLineEdit(eltern)
    {
    }

    void meinLineEdit::mousePressEvent(QMouseEvent *event)
    {
    ui->label->setText("Erklärungstext..."); //funktioniert nicht, da ui nicht bekannt ist.
    }
    [/code]

    main.cpp:
    [code="cpp"]
    #include "mainwindow.h"
    #include <QApplication>
    #include "meinLineEdit.h"

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

    meinLineEdit *textbox = new meinLineEdit(&w);
    textbox->setGeometry(20, 50, 50, 20);
    w.show();
    
    return a.exec();
    

    }
    [/code]

    mainwindow.h:
    [code="cpp"]
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
    Q_OBJECT

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

    private:
    Ui::MainWindow *ui;
    };

    #endif // MAINWINDOW_H
    [/code]

    mainwindow.cpp:
    [code="cpp"]
    #include "mainwindow.h"
    #include "ui_mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    }

    MainWindow::~MainWindow()
    {
    delete ui;
    }
    [/code]

    Was mache ich falsch? Ist das Vorgehen grundsätzlich so richtig?
    Ich bin um jede Hilfe dankbar



  • Dafür nimmt man in QT Signal&Slot, schau dir die Doku dazu an.
    In deinem Fall nimmst du unveränderte QLineEdit und QPushButton im Formular, erstellst in der MainWindow Klasse einen Slot, mit dem Du das QLineEdit änderst, und verbindest das QPushButton::clicked Signal mit diesem Slot. Fertig.
    mainwindow.h:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private slots:
        void updateText();
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H
    

    mainwindow.cpp:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        connect(ui->pushButton, &QPushButton::clicked,
                this, &MainWindow::updateText);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::updateText()
    {
        ui->lineEdit->setText("Hello!");
    }
    
    

Log in to reply