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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Qlabel и сигналы  (Прочитано 19138 раз)
Sergeich
Гость
« Ответ #15 : Сентябрь 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-ку должны быть проблемы.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #16 : Сентябрь 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) );
...
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pahom
Гость
« Ответ #17 : Сентябрь 05, 2007, 14:15 »

Все верно...
Да, работает. Спасибо большое. А если я хочу не backGround менять, а цвет шрифта, то как быть в этом случае?
Записан
denka
Гость
« Ответ #18 : Сентябрь 05, 2007, 14:25 »

Используй
Код:
palette.setColor( QPalette::Foreground, цвет );
Записан
pahom
Гость
« Ответ #19 : Сентябрь 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 однозначно...
« Последнее редактирование: Сентябрь 06, 2007, 06:28 от pahom » Записан
denka
Гость
« Ответ #20 : Сентябрь 06, 2007, 08:24 »

А че за класс? Че за ф-ция? Как вызываеш?
Записан
pahom
Гость
« Ответ #21 : Сентябрь 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()) см. код в предыдущих постах.
С уважением.
Записан
denka
Гость
« Ответ #22 : Сентябрь 06, 2007, 09:34 »

А где создаеться экземпляр gsmbf2? Ты к нему ведь обращаешся в Filter::eventFilter напиши код который не работает...
Записан
pahom
Гость
« Ответ #23 : Сентябрь 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;
}
Записан
denka
Гость
« Ответ #24 : Сентябрь 06, 2007, 10:03 »

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

З.Ы. просто вызывать ф-цию test() как ты это сделал в примере нельзя! она являеться членом другого класса. С++ это ведь ООП программирования не так ли Подмигивающий
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #25 : Сентябрь 06, 2007, 10:50 »

2 pahom: Сначало стоит вам изучить азы С++, а потом уже браться за Qt! Не в обиду, но вы этих азов не знаете.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pahom
Гость
« Ответ #26 : Сентябрь 06, 2007, 12:33 »

Вхреначил.
Код:
	gsmbf2* sm =new gsmbf2();
sm->test();
Компилится. Ни одного warning-a но не работает.
Записан
pahom
Гость
« Ответ #27 : Сентябрь 06, 2007, 12:37 »

2 pahom: Сначало стоит вам изучить азы С++, а потом уже браться за Qt! Не в обиду, но вы этих азов не знаете.
Даже если и так, что вовсе не так, я не имею права задать вопрос? Никаких обид. Крутой
Записан
denka
Гость
« Ответ #28 : Сентябрь 06, 2007, 13:02 »

Не работает что именно? Вот этот код:
Код:
gsmbf2* sm =new gsmbf2();
sm->test();
или вызов activateDownload()?
Записан
pahom
Гость
« Ответ #29 : Сентябрь 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 тишина... Наступает депрессия.  Непонимающий
Шучу. Крутой
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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