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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача строки из фильтра события или Почему ничего нет:( [РЕШЕНО]  (Прочитано 3766 раз)
ejik v tumane
Гость
« : Апрель 04, 2013, 15:13 »

Решил на днях посмотреть что за зверь такой Qt. И решил написать программу отличную от хеловорлда.

Суть такая: при наведении мыши на конопку в лейбле отображается имя объекта (кнопки), если кто-то предложит другой вариант например через текст кнопки рад буду посмотреть.

Программа вроде как обрабатывает события и имена кнопок в заглушке-месаже появляются исправно (в отлачике тоже всё ок). Но вот после отправки сиглала беда, слот сигнал не обрабатывает, и сиглал ведёт себя странно (при трасировке connectа отладчик замирает в раздумьях при просмотре содержимого строки name_string).
Немогу понять вчём дело почему не отсылается строка в сигнале, или не принимается слотом.
Просьба не пинать, как говориться простить, понять и помочь.

ниже превожу код всего что есть... (много шелуши с настройками кнопок но удалять не стал)
main:

Код:
#include <QtGui>
#include "Top_menu.h"

int main (int argc, char** argv)
{
    QApplication app(argc, argv);

    Top_menu top_menu;
    top_menu.show();

    return app.exec();
}

заголовочный файл меню:

Код:
#ifndef TOP_MENU_H
#define TOP_MENU_H

#include <QtGui>
#include "Name_Filter.h"

//===================================================================================
class Top_menu : public QWidget {
    Q_OBJECT
private:
    QStatusBar* statBar_info_top;
    QLabel* labelbut;
    Name_Filter* name_filter;

public:
    Top_menu(QWidget *parent_obj=0);

};

#endif // TOP_MENU_H

реализация меню:
Код:
#include <QtGui>
#include "Top_menu.h"

//=============================================================================
Top_menu :: Top_menu(QWidget *parent_obj/*=0*/)
        : QWidget(parent_obj)

{

 // Create object Name Filter
    name_filter = new Name_Filter;

 // Create label for Operation name
    labelbut = new QLabel("No operations");
    labelbut -> setMouseTracking(true);

 // Create Button Exit
    QPixmap exitpix("powerdown_top.jpg");
    QPushButton* pcmExit = new QPushButton ("&Exit");
    pcmExit -> setIcon(exitpix);
    pcmExit -> setIconSize(exitpix.size());
    pcmExit -> setDefault(true);
    pcmExit -> setObjectName("Exit to program");
    pcmExit -> setAttribute(Qt::WA_Hover);
    pcmExit->installEventFilter(new Name_Filter(pcmExit));

 // Create Button Ejik_v_tumane
    QPixmap settingspix("Ejik_v_tumane.jpg");
    QPushButton* pcmSettings = new QPushButton ("&Ejik_v_tumane");
    pcmSettings -> setIcon(settingspix);
    pcmSettings -> setIconSize(settingspix.size());
    pcmSettings -> setObjectName("Odin_Ejik_v_tumane");
    pcmSettings -> setAttribute(Qt::WA_Hover);
    pcmSettings->installEventFilter(new Name_Filter(pcmSettings));

 // Create Button Vtoroy_Ejik_v_tumane
    QPixmap rek_workpix("Vtoroy_Ejik_v_tumane.jpg");
    QPushButton* pcmRek_work = new QPushButton ("&Vtoroy_Ejik_v_tumane");
    pcmRek_work-> setIcon(rek_workpix);
    pcmRek_work -> setIconSize(rek_workpix.size());
    pcmRek_work -> setObjectName("Dva_Ejika_v_tumane");
    pcmRek_work -> setAttribute(Qt::WA_Hover);
    pcmRek_work->installEventFilter(new Name_Filter(pcmRek_work));

//  Slot configuration Name Batton
    QObject::connect(name_filter, SIGNAL(send_name_string(QString)), labelbut, SLOT(setText(QString)));
//    QObject::connect(name_filter, SIGNAL(send_name_string(const QString &)), labelbut, SLOT(setText(const QString &)));

//  Slot configuration
    connect(pcmExit, SIGNAL(clicked()), qApp, SLOT(quit()));

// Create StatusBar (info Top menu)
    statBar_info_top = new QStatusBar;
    statBar_info_top->showMessage("Operations: " +  labelbut->text(), 30000);
    statBar_info_top->setMinimumWidth(200);

 // Layout setup
    QHBoxLayout* phbxLayout = new QHBoxLayout;
    phbxLayout->setMargin(2);
    phbxLayout->addWidget(pcmRek_work);
    phbxLayout->addWidget(pcmSettings);
    phbxLayout->addWidget(pcmExit);

    QVBoxLayout* pvbxLayout = new QVBoxLayout;
    pvbxLayout->setSpacing(10);
    pvbxLayout->addLayout(phbxLayout);
    pvbxLayout->addWidget(labelbut);
    pvbxLayout->addWidget(statBar_info_top);
    setLayout(pvbxLayout);

    setWindowTitle(tr("Super Ejiki v0.01"));
    setFixedHeight(sizeHint().height());
    setFixedWidth(sizeHint().width());

}

заголовочный файл события
Код:
#ifndef NAME_FILTER_H
#define NAME_FILTER_H

#include <QObject>

//===================================================================================================
class Name_Filter : public QObject {
Q_OBJECT
private:
    QString name_string;

public:
    Name_Filter(QObject* parent_obj = 0);

protected:
    virtual bool eventFilter(QObject*, QEvent*);

signals:
    void send_name_string(QString);
   // void send_name_string(const QString &);

};

#endif // NAME_FILTER_H

реализация события:
Код:
#include <QtGui>
#include "Name_Filter.h"

//=================================================================================================
Name_Filter::Name_Filter(QObject* parent_obj/* =0*/)
    : QObject(parent_obj)
{
}

//=================================================================================================
/*virtual*/ bool Name_Filter::eventFilter(QObject* parent_obj, QEvent* pe)
            {
            if(pe->type() == QEvent::HoverEnter) {
                            name_string = parent_obj->objectName();
                            emit send_name_string(name_string);
                         //   QMessageBox::information(0, "String include", name_string);
                            return true;
                            }
            return false;

            }

Привёл всё как есть, извиняюсь за объём, но я не могу понять где зарыта собака.
« Последнее редактирование: Апрель 05, 2013, 08:47 от ejik v tumane » Записан
Bepec
Гость
« Ответ #1 : Апрель 04, 2013, 15:21 »

Я советую запаковать проект в архив и залить куда нить.

PS глаза в конце дня от кода разбегаются Веселый
Записан
mutineer
Гость
« Ответ #2 : Апрель 04, 2013, 15:21 »

Ты ставишь фильтром на объекты три разных инстанса Name_Filter, но к их сигналам не коннектишься, а коннектишься к сигналу от name_filter, который ни к кому ни прицеплен как фильтр. Итого три безымянных объекта исправно фильтруют и высылают сигналы вникуда
Записан
ejik v tumane
Гость
« Ответ #3 : Апрель 04, 2013, 15:29 »

К сожалению я не настолько ловко в данный момент общаюсь с Qt чтобы так ловко всё исправить, можно ткнуть меня носом Смеющийся

я примерно догадываюсь в чём дело, но примеров реализации подобного у меня нет.

так?:
 pcmRek_work->installEventFilter(name_filter(pcmRek_work));
« Последнее редактирование: Апрель 04, 2013, 15:32 от ejik v tumane » Записан
mutineer
Гость
« Ответ #4 : Апрель 04, 2013, 15:32 »

Вот ты подписываешься на сигнал у объекта name_filter:
Код:
name_filter = new Name_Filter;
...
QObject::connect(name_filter, SIGNAL(send_name_string(const QString &)), labelbut, SLOT(setText(const QString &)));


А вот тут ты ставишь в качестве фильтра совершенно другой объект, на сигнал которого ты не подписан. Но именно этот объект высылает сигнал при наведении на pcmExit:
Код:
pcmExit->installEventFilter(new Name_Filter(pcmExit));
Записан
mutineer
Гость
« Ответ #5 : Апрель 04, 2013, 15:36 »

так?:
 pcmRek_work->installEventFilter(name_filter(pcmRek_work));

Странная строка... name_filter(pcmRek_work) - для чего тут pcmRec_work?
Записан
ejik v tumane
Гость
« Ответ #6 : Апрель 04, 2013, 15:38 »

mutineer

Спасибо, спасли.
Записан
ejik v tumane
Гость
« Ответ #7 : Апрель 04, 2013, 15:39 »

так?:
 pcmRek_work->installEventFilter(name_filter(pcmRek_work));

Странная строка... name_filter(pcmRek_work) - для чего тут pcmRec_work?

Поспешишь как говориться))
Сделал уже в программе, всё работает! Это по невнимательности, или глупости
Код:
 pcmRek_work->installEventFilter(name_filter);
« Последнее редактирование: Апрель 04, 2013, 15:41 от ejik v tumane » Записан
ejik v tumane
Гость
« Ответ #8 : Апрель 04, 2013, 19:25 »

В связи с реализацией вышеописаного возник ещё один вопросик.

Всё конечно здорово и лейбл исправно ловит названия кнопок, но вот есть одно изменение в поведении этих самых кнопок, если раньше они подсвечивались при наведении курсора, то теперь они не поколебимы.
Есть ли какой-нибудь влаг для изменения такого поведения, или надо изобретать подсветку?
К тому же как я понял стандартная подсветка продиктована стилем операционной системы, что нехотелось бы нарушать.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #9 : Апрель 04, 2013, 22:06 »

просто не возвращай тру для перехваченного события
Записан

Изучением 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
ejik v tumane
Гость
« Ответ #10 : Апрель 05, 2013, 08:47 »

просто не возвращай тру для перехваченного события

Спасибо!

Ставлю теме решно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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