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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Потеря фокуса QPushButton (примерчик)  (Прочитано 14203 раз)
DenisG
Гость
« : Июль 14, 2009, 10:22 »

Задача: Есть несколько кнопок QPushButton
на всех кнопках есть икноки. Кнопка которая получила фокус должна менять свою икноку.
После потери фокуса она должна востанавливать старую иконку.
Проблема с контролем потери фокуса. смена картинок не проблема.
По форуму поискал - схожые темы есть, но с примерами хуже. 

Если  не сложно, дайте простенький пример для двух кнопок.


Записан
spectre71
Гость
« Ответ #1 : Июль 14, 2009, 10:48 »

virtual void focusInEvent ( QFocusEvent * event )
virtual void focusOutEvent ( QFocusEvent * event )

Переопредели в наследнике QPushButton, либо через eventFilter.
Записан
DenisG
Гость
« Ответ #2 : Июль 14, 2009, 11:19 »

Cпасибо за ответ. Эти функции видел в документации....
Я специально вопрос задал в разделе для новичков:)
Можно все же полный пример, путаюсь в синтаксисе, так как о сновном пишу на чистом Си и не для PC...
а тут нужда заставила за Qt взяться... 



Записан
spectre71
Гость
« Ответ #3 : Июль 14, 2009, 11:36 »

Поищи по форуму focusInEvent, focusOutEvent.
Найдешь кучу тем и примеров.
Записан
DenisG
Гость
« Ответ #4 : Июль 14, 2009, 13:05 »

Я  правильно понял, что мне надо создать свой клас на кнопоки и пользоваться уже своим классом?
Записан
spirit
Гость
« Ответ #5 : Июль 14, 2009, 13:08 »

установи ивент фильтр на кнопари и отлавливай нужные ивенты.
читай про QObject::installEventFilter.
Записан
spirit
Гость
« Ответ #6 : Июль 14, 2009, 13:50 »

вот пример, файлы с изображениями генерятся на ленту.
h-file
Код
C++ (Qt)
#ifndef TEST_H
#define TEST_H
 
#include <QDialog>
 
class Test: public QDialog
{
Q_OBJECT
 
public:
Test(QWidget *parent = 0);
 
private:
void init();
 
protected:
virtual bool eventFilter(QObject *o, QEvent *e);
 
private:
enum State { FocusIn, FocusOut };
 
int m_rows;
int m_columns;
};
 
#endif//TEST_H
 
cpp-file
Код
C++ (Qt)
#include <QtGui>
#include "test.h"
 
Test::Test(QWidget *parent)
: QDialog(parent), m_rows(5), m_columns(5)
{
init();
}
 
void Test::init()
{
QGridLayout *gl = new QGridLayout(this);
for (int r = 0; r < m_rows; ++r) {
for (int c = 0; c < m_columns; ++c) {
QPushButton *pb = new QPushButton();
pb->setProperty("state", FocusOut);
 
const QString fIn = QString::number(r) + QString::number(c) + "in.png";
const QString fOut = QString::number(r) + QString::number(c) + "out.png";
 
QPixmap fi(100, 100);
fi.fill(QColor(qrand()%255, qrand()%255, qrand()%255));
fi.save(fIn);
 
QPixmap fo(100, 100);
fo.fill(QColor(qrand()%255, qrand()%255, qrand()%255));
fo.save(fOut);
 
pb->setProperty("focusInImageName", fIn);
pb->setProperty("focusOutImageName", fOut);
pb->setText("FocusOut");
pb->setIcon(QIcon(fo));
pb->installEventFilter(this);
gl->addWidget(pb, r, c);
}
}
setFocus();
}
 
bool Test::eventFilter(QObject *o, QEvent *e)
{
QPushButton *pb = qobject_cast<QPushButton *>(o);
if (pb && (e->type() == QEvent::FocusIn || e->type() == QEvent::FocusOut)) {
const State state = State(pb->property("state").toInt());
pb->setText(state == FocusIn ? "FocusOut" : "FocusIn");
pb->setProperty("state", state == FocusIn ? FocusOut : FocusIn);
const QString fileName = (state == FocusIn ? pb->property("focusOutImageName").toString() : pb->property("focusInImageName").toString());
pb->setIcon(QIcon(fileName));
}
return QDialog::eventFilter(o, e);
}
 
main.cpp
Код
C++ (Qt)
#include <QApplication>
#include "test.h"
 
int main(int argc, char **argv)
{
QApplication app(argc, argv);
 
Test test;
test.show();
 
return app.exec();
}
 
Записан
DenisG
Гость
« Ответ #7 : Июль 14, 2009, 14:19 »

Спасиб! буду изучать!
Записан
spectre71
Гость
« Ответ #8 : Июль 14, 2009, 14:33 »

Я  правильно понял, что мне надо создать свой клас на кнопоки и пользоваться уже своим классом?

Да, Сначала сделай так.
 
Код
C++ (Qt)
class MyPushButton : public QPushButton {
 Q_OBJECT
 
 public:
   MyPushButton ( QWidget * parent = 0) : QPushButton(parent) {}
   ~MyPushButton () {}
...
...
 protected:
   virtual void focusInEvent ( QFocusEvent * event );
   virtual void focusOutEvent ( QFocusEvent * event );
};
 

eventFilter - попробуешь когда получше разберешся.
Записан
BRE
Гость
« Ответ #9 : Июль 14, 2009, 14:43 »

Думаю, можно попробовать добиться такого поведения используя StyleSheet.
Записан
DenisG
Гость
« Ответ #10 : Июль 14, 2009, 17:06 »

Спасибо за примеры.
Все  поковыряю в порядке поступления.
Снала eventFilter - потом через клас.

to BRE - на StyleSheet у меня и работает так две кнопки.
Одну нажал  - сменил ее картинку - надругой востановил старую.
Кнопок будет с десяток. Это будет печально.

Для меня  очень важно быстродействие этого приложения.
Поэтому перепробую все - где быстрее будет фурыкать то и оставлю.
Платформа 200МГц всего;)   На такой скорости сразу заметно торможения во время конекта сигнала и слотоа. буквально больше 3 конектов и тормоза полные;)
Записан
BRE
Гость
« Ответ #11 : Июль 14, 2009, 17:20 »

Платформа 200МГц всего;)   На такой скорости сразу заметно торможения во время конекта сигнала и слотоа. буквально больше 3 конектов и тормоза полные;)
Неужели всего три коннекта успевает....  Подмигивающий
Даааа, ослабли двести мегагерцовые машины, совсем плохие стали.  Подмигивающий

Вроде, такое поведение можно сделать установив один раз стиль для виджета на котором находятся эти кнопки....
« Последнее редактирование: Июль 14, 2009, 17:30 от BRE » Записан
DenisG
Гость
« Ответ #12 : Июль 14, 2009, 17:38 »

ща посчитал реально я тестил 8 конектов слайдеры друг за друга цеплял - тормоза заметные
за удобство всегда приходиться расплачиваться ресурсами....

На тему StyleSheet - пример в студию!

собрал на таргет пример spirit-а - шустро все работает;) 25 кнопарей
Записан
BRE
Гость
« Ответ #13 : Июль 14, 2009, 18:20 »

ща посчитал реально я тестил 8 конектов слайдеры друг за друга цеплял - тормоза заметные
за удобство всегда приходиться расплачиваться ресурсами....
А можно подробней, что за коннекты. Желательно с куском кода. А то мне не совсем понятно.

На тему StyleSheet - пример в студию!
Все правила описывается в одном файле и устанавливаются для родительского виджета.
Кнопкам назначаются имена. Далее примерно так:
Код:
QPushButton#button1 {
    image: url( image1.png );
}

QPushButton#button1:focus {
    image: url( image1_focused.png );
}

QPushButton#button2 {
    image: url( image2.png );
}

QPushButton#button2:focus {
    image: url( image2_focused.png );
}

...
Записан
DenisG
Гость
« Ответ #14 : Июль 14, 2009, 18:35 »

Код:
   QObject::connect(ui->dial, SIGNAL(valueChanged(int)), ui->verticalSlider, SLOT(setValue(int)));
    QObject::connect(ui->dial, SIGNAL(valueChanged(int)), ui->horizontalSlider, SLOT(setValue(int)));

    QObject::connect(ui->verticalSlider, SIGNAL(valueChanged(int)), ui->horizontalSlider, SLOT(setValue(int)));
    QObject::connect(ui->verticalSlider, SIGNAL(valueChanged(int)), ui->dial, SLOT(setValue(int)));

    QObject::connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), ui->verticalSlider, SLOT(setValue(int)));
    QObject::connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), ui->dial, SLOT(setValue(int)));

    QObject::connect(ui->dial, SIGNAL(valueChanged(int)), ui->lcdNumber, SLOT(display(int)));
    QObject::connect(ui->dial, SIGNAL(valueChanged(int)), ui->progressBar, SLOT(setValue(int)));


BRE а можно примерчик как сделал spirit - для чайников)

Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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