Решил на днях посмотреть что за зверь такой 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;
}
Привёл всё как есть, извиняюсь за объём, но я не могу понять где зарыта собака.