Russian Qt Forum
Апрель 29, 2024, 09:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Ошибка преобразования QObject в QWidget. Передача свойств в обработчик событий  (Прочитано 10009 раз)
aviabunin
Гость
« : Октябрь 08, 2011, 16:48 »

Есть класс таблицы, унаследованный от QTableWidget. В нем - переменная mode.
Код:
#include <QTableWidget>
class myTable : public QTableWidget
{
    Q_OBJECT
public:
    myTable(QWidget *parent = 0);
    int mode;
};
Из основного класса создаю фильтр событий

Код:
iSticks::iSticks(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::iSticks)
{
    ui->setupUi(this);

    ui->tableWidget->installEventFilter(new ev_filter(ui->tableWidget));
...
}
В обработчике событий пытаюсь получить значение  mode
Код:
int mode;
ev_filter::ev_filter(QObject *parent) :
    QObject(parent)
{
    mode = ((myTable)parent).mode;
}

При выполнении получаю ошибку
Код:
ошибка: invalid conversion from 'QObject*' to 'QWidget*'
В чем может быть дело?
Спасибо за любую подсказку или ссылку.
PS. Как лучше передать свойства главного класса в обработчик событий?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Октябрь 08, 2011, 17:07 »

используй приведение типов Си++, вместо Си. А ещё лучше Qt:
qobject_cast<QWidget*>(parent)
Записан

Юра.
aviabunin
Гость
« Ответ #2 : Октябрь 08, 2011, 17:58 »

Сделал так:
Код:
myTable tableWidget;
int mode;

ev_filter::ev_filter(QObject *parent) :
    QObject(parent)
{
    tableWidget = qobject_cast<myTable>)parent;
    mode = tableWidget.mode;
 Получаю
Код:
ошибка: no match for 'operator=' in 'tableWidget = qobject_cast<myTable>'
 candidates are: myTable& myTable::operator=(const myTable&)
ошибка: expected ';' before 'parent'
Не получается, вообщем.
2. Как можно еще получить доступ к переменным главного модуля? или к переменным parent - но для этого нужно
преобразовать QObject к своему типу myTable,  в котором введены переменные параметры.
« Последнее редактирование: Октябрь 08, 2011, 18:21 от aviabunin » Записан
Kolobok
Гость
« Ответ #3 : Октябрь 08, 2011, 18:23 »

tableWidget это объект, а parent - указатель.
Записан
iroln
Гость
« Ответ #4 : Октябрь 08, 2011, 18:28 »

Я не очень понимаю, зачем вы тут всё это наворотили. Улыбающийся
Получить доступ к переменным вашего "главного модуля" можно в методе класса этого самого главного модуля. Улыбающийся

Виртуальный метод eventFilter есть в каждом классе, наследуемом от QObject. Это любой виджет. Не обязательно создавать для этого отдельный класс фильтра. Определите метод eventFilter в своём классе "главного модуля" вот и всё. В этом методе будут доступны все данные класса. Улыбающийся

Цитировать
преобразовать QObject к своему типу myTable,  в котором введены переменные параметры.
Непонимающий Строит глазки
« Последнее редактирование: Октябрь 08, 2011, 18:31 от iroln » Записан
aviabunin
Гость
« Ответ #5 : Октябрь 08, 2011, 21:19 »

1. Метод eventFilter() определил. А как сделать, чтобы он заработал. Чем заменить строку:
Код:
//    ui->tableWidget->installEventFilter(new ev_filter(ui->tableWidget));
Ведь должно быть нечто вроде
Код:
this->installEventFiter...
?
2.Такое преобразование работает
Код:
tableWidget = (myTable *)parent;
а такое нет -
Код:
tableWidget = qobject_cast<myTable *>parent;
Как правильно сделать второе преобразование?
Спасибо!
Записан
aviabunin
Гость
« Ответ #6 : Октябрь 08, 2011, 21:34 »

Если не ошибся записал так:
Код:
    this->installEventFilter(this);
Но, почему то  перенесенный код
Код:
bool iSticks::eventFilter(QObject* pobj, QEvent* pe)
{
 if(pe->type() != QEvent::KeyPress) return false;  //  Ловим только событие "keyPress"
    if(((QKeyEvent*)pe)->key()==Qt::Key_Space){
        this->mode ^= 1;
        return true;
    }

    if(this->mode == 0) return false; // Если режим перемещения - будет работать функционал таблицы.

    return true;
}
стал выдавать ошибку:
Код:
ошибка: invalid use of incomplete type 'struct QKeyEvent'
?
Записан
iroln
Гость
« Ответ #7 : Октябрь 08, 2011, 21:44 »

Должно быть вот так:

Код:
// это делается в конструкторе класса главной формы приложения (iSticks видимо)
ui->tableWidget->installEventFilter(this)

...

bool iSticks::eventFilter(QObject* pobj, QEvent* pe)
{
    // тут перехватываете события для тех объектов, для которых установлен фильтр
    // в вашем случае для tableWidget
    ...
}

Ошибку выдаёт вот это?
Код
C++ (Qt)
if(((QKeyEvent*)pe)->key()==Qt::Key_Space){

Зачем это вообще делать? Сначала проверяете, что событие имеет тип KeyPress и этого достаточно. Дальше просто пишите:
Код
C++ (Qt)
if (pe->key() == Qt::Key_Space) {
   ...
}
 
« Последнее редактирование: Октябрь 08, 2011, 21:48 от iroln » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #8 : Октябрь 08, 2011, 21:47 »

Цитировать
ошибка: invalid use of incomplete type 'struct QKeyEvent'
допиши #include <QKeyEvent>. и
используй приведение типов Си++, вместо Си.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
iroln
Гость
« Ответ #9 : Октябрь 08, 2011, 21:51 »

используй приведение типов Си++, вместо Си.
Да не надо тут типы приводить, зачем? Событие уже нужного типа.

Хотя возможно нужно (расслабился я с питонами), но надо использовать static_cast.

Код
C++ (Qt)
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(pe);
if (keyEvent->key() == Qt::Key_Space) {
   ...
}
 
« Последнее редактирование: Октябрь 08, 2011, 21:59 от iroln » Записан
aviabunin
Гость
« Ответ #10 : Октябрь 08, 2011, 22:13 »

Теперь почему то через строку
Код:
    if(pe->type() != QEvent::KeyPress) return false;  //  Ловим только событие "keyPress"
если нажимать стрелки или пробел - не проходит. А если скажем - обычный символ типа "a" ...
То проходит.
А когда в отдельном классе было - таких проблем не было.
?
Записан
aviabunin
Гость
« Ответ #11 : Октябрь 08, 2011, 22:17 »

Весь обработчик:
Код:
bool iSticks::eventFilter(QObject* pobj, QEvent* pe)
{

    qDebug()<<"0";
    if(pe->type() != QEvent::KeyPress) return false;  //  Ловим только событие "keyPress"
    qDebug()<<"1";

    if(((QKeyEvent*)pe)->key()==Qt::Key_Space){ // если пробел - переключаем режим стрелок
        qDebug()<<"1";
        this->mode ^= 1;
        return true;
    }

    if(this->mode == 0) return false; // Если режим перемещения - будет работать функционал таблицы.

    return true;
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #12 : Октябрь 08, 2011, 22:30 »

Хотя возможно нужно (расслабился я с питонами), но надо использовать static_cast.
а я его и имел в виду
если нажимать стрелки или пробел - не проходит. А если скажем - обычный символ типа "a" ...
ну так посмотри какой там тип события при стрелках и пробеле. хотя странно, что не QEvent::KeyPress...
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
aviabunin
Гость
« Ответ #13 : Октябрь 08, 2011, 23:04 »

1. В отдельном классе работало.
2. В отладчике - пишет , что pe - QEvent
             pe->type() no such value.
На всякий случай посылаю код (продолжать уже завтра буду)
Записан
iroln
Гость
« Ответ #14 : Октябрь 08, 2011, 23:10 »

Отдельный класс тут не при чём. Вы что-то не так делаете.

Вот я только что написал простейший пример (myform.h файл опускаю):
Код
C++ (Qt)
#include <QKeyEvent>
#include <QDebug>
#include "myform.h"
 
MyForm::MyForm(QWidget *parent) :
   QMainWindow(parent)
{
   button = new QPushButton(this);
 
   button->setText("hello");
   button->installEventFilter(this);
}
 
bool MyForm::eventFilter(QObject *obj, QEvent *event)
{
   if (event->type() == QEvent::KeyPress) {
       QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
 
       qDebug() << obj;
       qDebug() << event;
       qDebug() << keyEvent->key();
   }
   return false;
}
 

Реагирует на нажатие всех кнопок клавиатуры.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.125 секунд. Запросов: 22.