QT 5.0.1 formularz z kreatora problem z rozbudową klasy

0
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QKeyEvent"
#include "QtGui"

class MainWindow: public QWidget
{
public:
    MainWindow ();
    ~MainWindow () {};
    bool event (QEvent * event);
};

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

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::event (QEvent * event)
{
    event->accept;

    if (vent -> type () == QEvent::KeyPress)
    {
       
    }
}

Jako noob w temacie QT proszę o pomoc. Chcę zrobić zdarzenie polegające na wczytaniu do line-edit'a znaku który zostanie wciśnięty na klawiaturze. Problem jest z redefinicją metody event. Kod powyższy to redefinicja klasy która powstała w wyniku wyklikania okienka w kreatorze.

0

Zapewne QLineEdit zjada ci znaki.
Napisz dokładnie i zrozumiale co chcesz osiągnąć.

0

Chcę wykorzystać mechanizm zdarzeń QT w taki sposób by osadzony w formularzu QLineEdit wyświetlił mi znak który wcisnę na klawiaturze w trakcie działania programu. Obiekt klasy QLineEdit jest umieszczony na formularzu wygenerowanym w kreatorze. Zacząłem obsługę zdarzenia ale niestety kompilator zwraca mi: "statement cannot resolve address of overloaded function"

1

Chcesz aby w QLineEdit pojawil sie znak wpisany na klawiaturze. Ok. To jest standardowa opcja więc jak nie zmieniasz nic w eventach to bez jakiejkolwiek modyfikacji tak się zachowa. Czy chcesz też aby pojawiały się tam znaki nawet jeśli to nie na QLineEdit jest focus?

0

Szczerze mówiąc to nie wiem co to jest focus. Ja sobie wyobrażam to tak że nie ma kursora w polu tylko jest kliknięte szare tło aplikacji, wciskam przycisk pojawia się litera. Zdejmuję palec z klawisza i znika. W sumie tego typu ćwiczenia były na labelach, ale pośpiech zaszkodził i głupi koncept z tego wyszedł.

0

Usunąłem definicję klasy. Teraz kod wygląda tak:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QKeyEvent"
#include "QtGui"


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

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::event (QEvent * event)
{
    event->accept;

    if (event -> type () == QEvent::KeyPress)
    {

    }
}

Plik h wygłada tak:

#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();
    
protected:
    bool event (QEvent *event);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

Jedyny błąd jaki blokuje kompilację :statement cannot resolve address of overloaded function. Co może być jego przyczyną?

0

Czytasz w ogóle to co kompilator ci pokazuje?
Pokazał na linijkę

  event->accept;

Więc może dodasz łaskawie ten nawias jako wywolanie do nazwy funkcji accept?

0

To ma wyglądać tak (łącznie z generowaniem ładnego opisu klawiszy):

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QKeyEvent>

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

    // poniższe linijki można wyklikać w designerze zamiast je tu wpisywać
    ui->lineEdit->setFocusPolicy(Qt::ClickFocus);
    setFocusPolicy(Qt::StrongFocus);
    connect(this, SIGNAL(keyDescribed(QString)),
            ui->lineEdit, SLOT(setText(QString)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::keyPressEvent(QKeyEvent *e) {
    e->accept();
    QString str;
    switch (e->key()) {
    case Qt::Key_Shift:
        str = QKeySequence(Qt::ShiftModifier).toString();
        break;
    case Qt::Key_Control:
        str = QKeySequence(Qt::ControlModifier).toString();
        break;
    case Qt::Key_Alt:
        str = QKeySequence(Qt::AltModifier).toString();
        break;
    case Qt::Key_Meta:
        str = QKeySequence(Qt::MetaModifier).toString();
        break;
    default:
        str = QKeySequence(e->key()).toString();
    }
    emit keyDescribed(str);
}

A tu plik nagłówkowy dla @jj44 bo coś strasznie namieszał (upiększyłem też nieco kod używając sygnału): ```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();

void keyPressEvent(QKeyEvent *);

signals:
void keyDescribed(const QString &desc);

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

0

@Malootki
Masz rację. Zacząłem szukać problemu w innych miejscach zapominając o nawiasach. Po wyelominowaniu błędu program się kompiluje ale nic się nie da kliknąć a na klawiaturę nie reaguje w ogóle.

@MarekR22
Wkleiłem ten kod, niestety pojawia się :no 'void MainWindow::keyPressEvent(QKeyEvent*)' member function declared in class 'MainWindow'. Z tego co pamiętam wyjątki i ich podklasy oraz metody są obiektami które są generowane prze kompilator. Nie rozumiem tej sytuacji.

0

Niestety robiłem już tak i moc_mainwindow.cpp:-1: błąd:undefined reference to `MainWindow::event(QEvent*)' oraz collect2.exe:-1: błąd ld returned 1 exit status

0

Niestety nie pomogło...

1 użytkowników online, w tym zalogowanych: 0, gości: 1