Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: pahom от Сентября 04, 2007, 08:07



Название: Qlabel и сигналы
Отправлено: pahom от Сентября 04, 2007, 08:07
Доброе время суток.
Кто подскажет ответ на интересующий меня вопрос? А именно: "надо окрашивать label в другой цвет, при наведение курсора мыши. какое это событие (сигнал)?"
В Ассаулте всего два сигнала void linkActivated ( const QString & link ) void linkHovered ( const QString & link )...

ос: linux (openSuSE 10.2) Qt4.2.1

C уважением, Михаил.


Название: Re: Qlabel и сигналы
Отправлено: WW от Сентября 04, 2007, 10:08
Цитировать
mouseTracking : bool
This property holds whether mouse tracking is enabled for the widget.
If mouse tracking is disabled (the default), the widget only receives mouse move events when at least one mouse button is pressed while the mouse is being moved.
If mouse tracking is enabled, the widget receives mouse move events even if no buttons are pressed.
Access functions:
bool hasMouseTracking () const
void setMouseTracking ( bool enable )
See also mouseMoveEvent().


Название: Re: Qlabel и сигналы
Отправлено: QCasper от Сентября 04, 2007, 13:32
Если задача лишь покрасить лэйбл при наведении, то возможно более лучшим выходом из положения будет применение CSS. Qt 4.2 вроде как уже умеет.


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 04, 2007, 13:40
и как сие заюзать? мне бы примерчик.


Название: Re: Qlabel и сигналы
Отправлено: QCasper от Сентября 04, 2007, 14:34
http://doc.trolltech.com/4.3/stylesheet.html


Название: Re: Qlabel и сигналы
Отправлено: Sergeich от Сентября 04, 2007, 16:11
QEvent::Enter - Mouse enters widget's boundaries.
QEvent::Leave - Mouse leaves widget's boundaries.


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 05, 2007, 05:07
Ребята, вы не поняли. Я немогу понять как связать стиль и лабел или к нему евент прикрутить. Пример можно? Или так и будете ссылки кидать с методами? Я ведь, прежде чем писать, это все смотрел.


Название: Re: Qlabel и сигналы
Отправлено: QCasper от Сентября 05, 2007, 08:47
Я не пойму задача в чем заключается?

1. Сделать чтобы лэйбл меня цвет при наведении мыши. Любым способом.
2. Во что бы то ни стало прикрутить обработку события наведения мыши. Неважно для каких целей.
3. Сделать и то и другое?

Какая из этих всех задач приоритетней. Если первая, то достаточно заюзать CSS как при оформлении HTML доков, что-то типа setStyle("QLabel:hovered {background:#FF3300}"). Подробнее см. ссылку.


Название: Re: Qlabel и сигналы
Отправлено: Sergeich от Сентября 05, 2007, 10:51
Код:
class Filter : public QObject
{
public:
  Filter( QObject* parent = 0 ) : QObject(parent) {}
  bool eventFilter( QObject* obj, QEvent* e );
};

bool Filter::eventFilter( QObject* obj, QEvent* e )
{
  if ( !obj->isWidgetType() ) return;
  QWidget* w = (QWidget*) obj;
  if ( e->type() == QEvent::Enter ) {
    w->setPaletteBackgroundColor( QColor(200, 210, 220) );
  }
  else if ( e->type() == QEvent::Leave ) {
    w->setPaletteBackgroundColor( QColor(200, 200, 200) );
  }
  return false;
}

QLabel* label = new QLabel( "Bla-bla-bla", 0 );
label->installEventFilter( new Filter(label) );


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 05, 2007, 11:24
Код:
class Filter : public QObject
{
public:
  Filter( QObject* parent = 0 ) : QObject(parent) {}
  bool eventFilter( QObject* obj, QEvent* e );
};

bool Filter::eventFilter( QObject* obj, QEvent* e )
{
  if ( !obj->isWidgetType() ) return;
  QWidget* w = (QWidget*) obj;
  if ( e->type() == QEvent::Enter ) {
   w->setPaletteBackgroundColor( QColor(200, 210, 220) );//error
  }
  else if ( e->type() == QEvent::Leave ) {
    w->setPaletteBackgroundColor( QColor(200, 200, 200) );//error
  }
  return false;
}

QLabel* label = new QLabel( "Bla-bla-bla", 0 );
label->installEventFilter( new Filter(label) );
src/gsmbf2.cpp:40 error class 'QWidget' has no member named 'setPaletteBackgroundColor'
src/gsmbf2.cpp:43 error class 'QWidget' has no member named 'setPaletteBackgroundColor'


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 05, 2007, 11:28
Я не пойму задача в чем заключается?...
Все просто. когда указатель мыши попадает на label он окрашивается в синий, уходит - label становится черным. Мне сугубо все равно через что там это делается через CCS или еще как-то. Мне нужен пример. Я бы его разобрал, расковырял и было бы счастье. С уважением.


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 05, 2007, 12:15
Код:
class Filter : public QObject
{
public:
  Filter( QObject* parent = 0 ) : QObject(parent) {}
  bool eventFilter( QObject* obj, QEvent* e );
};

bool Filter::eventFilter( QObject* obj, QEvent* e )
{
  if ( !obj->isWidgetType() ) return;
  QWidget* w = (QWidget*) obj;
  if ( e->type() == QEvent::Enter ) {
//    w->setPaletteBackgroundColor( QColor(200, 210, 220) );
      QPalette palette;
      palette.setColor(w->backgroundRole(), QColor(200,210,220));
      w->setPalette(palette);
  }
  else if ( e->type() == QEvent::Leave ) {
//    w->setPaletteBackgroundColor( QColor(200, 200, 200) );
      QPalette palette;
      palette.setColor(w->backgroundRole(), QColor(200,200,200));
      w->setPalette(palette);
  }
  return false;
}

QLabel* label = new QLabel( "Bla-bla-bla", 0 );
label->installEventFilter( new Filter(label) );
заменил в коде строчки, как показано выше, компилится, однако, не работает.


Название: Re: Qlabel и сигналы
Отправлено: QCasper от Сентября 05, 2007, 13:04
Я не пойму задача в чем заключается?...
Все просто. когда указатель мыши попадает на label он окрашивается в синий, уходит - label становится черным. Мне сугубо все равно через что там это делается через CCS или еще как-то. Мне нужен пример. Я бы его разобрал, расковырял и было бы счастье. С уважением.

Подстава... оказывается из всех виджетов именно QLabel не поддерживает :hover. Только щас узнал об этом :-[ Ну, на будущее, если вдруг с другими виджетами захочется провернуть что-нить подобное, то не надо перегружать никакие эвенты, а просто сделать w.setStyleSheet(":hover{background:red}"); где w - объект любого стандартного виджета кроме QLabel.


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 05, 2007, 13:25
Цитировать
Подстава...
Спасибо, дорогой, что вовремя меня остановил. Я уже все волосы на голове повыдергивал. Хотел было за ствол хватануться, что бы монитор прострелить 8)) Будем придумывать что то другое.


Название: Re: Qlabel и сигналы
Отправлено: pastor от Сентября 05, 2007, 13:29
Цитировать
заменил в коде строчки, как показано выше, компилится, однако, не работает.

Установи для QLabel setAutoFillBackground(true)


Название: Re: Qlabel и сигналы
Отправлено: Sergeich от Сентября 05, 2007, 13:36
Код:
#include <qlabel.h>
#include <qapplication.h>

class Filter : public QObject
{
public:
  Filter( QObject* parent = 0 ) : QObject(parent) {}
  bool eventFilter( QObject* obj, QEvent* e );
};

bool Filter::eventFilter( QObject* obj, QEvent* e )
{
  if ( !obj->isWidgetType() ) return false;
  QWidget* w = (QWidget*) obj;
  if ( e->type() == QEvent::Enter ) {
    w->setPaletteBackgroundColor( QColor(255, 255, 200) );
  }
  else if ( e->type() == QEvent::Leave ) {
    w->setPaletteBackgroundColor( QColor(200, 200, 200) );
  }
  return false;
}

int main( int argc, char** argv ) {
QApplication app(argc, argv);
QWidget* mw = new QWidget();
app.setMainWidget(mw);
QLabel* label = new QLabel( "Bla-bla-bla", mw );
label->installEventFilter( new Filter(label) );
mw->show();
return app.exec();
}
Этот код без проблем работает на Qt 3.3.8, не думаю что с портированием на 4-ку должны быть проблемы.


Название: Re: Qlabel и сигналы
Отправлено: pastor от Сентября 05, 2007, 13:46
Этот код без проблем работает на Qt 3.3.8, не думаю что с портированием на 4-ку должны быть проблемы.

Все верно, но есть два момента:

1) setPaletteBackgroundColor - метод Qt3Support. Если Qt или прект собран без его поддержки, то этот метод ме будет найден. Заменяеться такой конструкцией:

Код:
QPalette palette;
 palette.setColor(widget->backgroundRole(), color);
 widget->setPalette(palette);

2) Нужно естанавливать setAutoFillBackground(true) для виджета

Код:
...
QLabel* label = new QLabel( "Bla-bla-bla", mw );
label->setAutoFillBackground(true);
label->installEventFilter( new Filter(label) );
...


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 05, 2007, 14:15
Все верно...
Да, работает. Спасибо большое. А если я хочу не backGround менять, а цвет шрифта, то как быть в этом случае?


Название: Re: Qlabel и сигналы
Отправлено: denka от Сентября 05, 2007, 14:25
Используй
Код:
palette.setColor( QPalette::Foreground, цвет );


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 06, 2007, 06:01
Используй
Код:
palette.setColor( QPalette::Foreground, цвет );
w->foregroundRole()

Ребята, а как прикрутить еще и событие клика мыши? У меня получилось
Код:
bool Filter1::eventFilter( QObject* obj, QEvent* e )
{
  if ( !obj->isWidgetType() ) return true;
  QWidget* w = (QWidget*) obj;
  if ( e->type() == QEvent::Enter ) {
 QPalette palette;
 palette.setColor(w->foregroundRole() , QColor(0,58,255));
 w->setPalette(palette);
  }
  else if ( e->type() == QEvent::Leave ) {
 QPalette palette;
 palette.setColor(w->foregroundRole(), QColor(0,0,0));
 w->setPalette(palette);
  }
   else if ( e->type() == QEvent::MouseButtonPress ){
      // вот тут что писать, если я допустим, хочу выполнить свою функцию при клике мышкой?
  }
  return false;
}
Дело в том, что функция, которую надо вызвать, находится в другом классе и почему-то из этого класса не видна. А она public однозначно...


Название: Re: Qlabel и сигналы
Отправлено: denka от Сентября 06, 2007, 08:24
А че за класс? Че за ф-ция? Как вызываеш?


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 06, 2007, 08:55
А че за класс? Че за ф-ция? Как вызываеш?
Код:
class Filter : public QObject
{
public:
  Filter( QObject* parent = 0 ) : QObject(parent) {}
  bool eventFilter( QObject* obj, QEvent* e );
};
//
class gsmbf2 : public QDialog, public Ui::gsm
{
Q_OBJECT
public:
gsmbf2( QWidget * parent = 0, Qt::WFlags f = 0 );
void activateDownload();
//....
private slots:
//....
};
А вот вызывать я пробовал по всякому. Не видет он ее (activateDownload()) см. код в предыдущих постах.
С уважением.


Название: Re: Qlabel и сигналы
Отправлено: denka от Сентября 06, 2007, 09:34
А где создаеться экземпляр gsmbf2? Ты к нему ведь обращаешся в Filter::eventFilter напиши код который не работает...


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 06, 2007, 09:50
А где создаеться экземпляр gsmbf2? Ты к нему ведь обращаешся в Filter::eventFilter напиши код который не работает...
Код:
gsmbf2::gsmbf2( QWidget * parent, Qt::WFlags f) 
: QDialog(parent, f)
{
QTextCodec *codec=QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
setupUi(this);
label->installEventFilter(new Filter(label));   
}
//
void gsmbf2::test()
{
textEdit->append("asd");
}
//
bool Filter::eventFilter( QObject* obj, QEvent* e )
{
  if ( !obj->isWidgetType() ) return true;
  QWidget* w = (QWidget*) obj;
  if ( e->type() == QEvent::Enter ) {
 QPalette palette;
 palette.setColor(w->foregroundRole() , QColor(0,58,255));
 w->setPalette(palette);
  }
  else if ( e->type() == QEvent::Leave ) {
 QPalette palette;
 palette.setColor(w->foregroundRole(), QColor(0,0,0));
 w->setPalette(palette);
  }
   else if ( e->type() == QEvent::MouseButtonPress ){
qDebug("ok");
// test(); или gsmbf2::test(); вот тут не могу вызвать test()
  }
  return false;
}


Название: Re: Qlabel и сигналы
Отправлено: denka от Сентября 06, 2007, 10:03
Если ты обращался к gsmbf2::activateDownload(); то тебе либо надо ф-цию activateDownload сделать статической,либо где-то создавать экземпляр класса gsmbf2 и через него уже вызывать эту ф-цию... На скока я понял проблема у тя именно в этом.

З.Ы. просто вызывать ф-цию test() как ты это сделал в примере нельзя! она являеться членом другого класса. С++ это ведь ООП программирования не так ли ;)


Название: Re: Qlabel и сигналы
Отправлено: pastor от Сентября 06, 2007, 10:50
2 pahom: Сначало стоит вам изучить азы С++, а потом уже браться за Qt! Не в обиду, но вы этих азов не знаете.


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 06, 2007, 12:33
Вхреначил.
Код:
	gsmbf2* sm =new gsmbf2();
sm->test();
Компилится. Ни одного warning-a но не работает.


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 06, 2007, 12:37
2 pahom: Сначало стоит вам изучить азы С++, а потом уже браться за Qt! Не в обиду, но вы этих азов не знаете.
Даже если и так, что вовсе не так, я не имею права задать вопрос? Никаких обид. 8)


Название: Re: Qlabel и сигналы
Отправлено: denka от Сентября 06, 2007, 13:02
Не работает что именно? Вот этот код:
Код:
gsmbf2* sm =new gsmbf2();
sm->test();
или вызов activateDownload()?


Название: Re: Qlabel и сигналы
Отправлено: pahom от Сентября 06, 2007, 13:08
Этот код работает. В textEdit ничего не пишет... Обнаружил интересную штуку. Изменил функцию вот так.
Код:
void gsmbf2::test()
{
    QMessageBox msgBox;
    msgBox.setStandardButtons(QMessageBox::Yes);
    msgBox.exec();
qDebug("asddsa");
textEdit->append("he he");
}
Запускаю программу, нажимаю на label месс с кнопкой yes появляется, дебаг вижу, но в textEdit тишина... Наступает депрессия.  ???
Шучу. 8)