QT 5.0.1 formularz z kreatora problem z rozbudową klasy

Odpowiedz Nowy wątek
2013-03-05 16:52

Rejestracja: 10 lat temu

Ostatnio: 4 lata temu

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.

Pozostało 580 znaków

2013-03-05 17:37

Rejestracja: 12 lat temu

Ostatnio: 1 godzina temu

0

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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2013-03-05 17:54

Rejestracja: 10 lat temu

Ostatnio: 4 lata temu

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"

edytowany 1x, ostatnio: jj44, 2013-03-05 18:29

Pozostało 580 znaków

2013-03-05 19:09

Rejestracja: 10 lat temu

Ostatnio: 5 lat temu

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?


Zero litości dla nieróbstwa.

Pozostało 580 znaków

2013-03-05 21:34

Rejestracja: 10 lat temu

Ostatnio: 4 lata temu

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ł.

jak masz kilka edytorów to jeden ma kursor i jest podświetlony, to jest właśnie focus. Określa on, który komponent ma pierwszeństwo do zdarzeń klawiatury. Przy czym nie wszystkie elementy (widgety) mogą przejmować focus. - MarekR22 2013-03-06 09:49

Pozostało 580 znaków

2013-03-07 12:29

Rejestracja: 10 lat temu

Ostatnio: 4 lata temu

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ą?

Pozostało 580 znaków

2013-03-07 15:35

Rejestracja: 10 lat temu

Ostatnio: 5 lat temu

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?


Zero litości dla nieróbstwa.

Pozostało 580 znaków

2013-03-08 22:03

Rejestracja: 12 lat temu

Ostatnio: 1 godzina temu

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):

#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

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22, 2013-03-09 15:25

Pozostało 580 znaków

2013-03-08 23:31

Rejestracja: 10 lat temu

Ostatnio: 4 lata temu

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.

brakuje ci deklaracji funkcji keyPressEvent (jest chyba oczywiste, że w nagłówku trzeba to dodać i nawet kompilator sam się wyraźnie dopomina dopomina, w Qt Creator wystarczy na funkcji zrobić Alt-Enter i gotowe). - MarekR22 2013-03-08 23:34

Pozostało 580 znaków

2013-03-09 07:47

Rejestracja: 10 lat temu

Ostatnio: 4 lata temu

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:error: ld returned 1 exit status

edytowany 1x, ostatnio: jj44, 2013-03-09 07:50
wyczyść projekt (Qt Creator: prawy klawisz myszy na projekcie "Wyczyść projekt"; linia poleceń: make clean/mingw32-make clean). - MarekR22 2013-03-11 10:54

Pozostało 580 znaków

2013-03-11 21:47

Rejestracja: 10 lat temu

Ostatnio: 4 lata temu

0

Niestety nie pomogło...

Pozostało 580 znaków

Odpowiedz

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