Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Григорий от Март 28, 2012, 11:12



Название: QLineEdit
Отправлено: Григорий от Март 28, 2012, 11:12
 Уважаемые форумчане , подскажите как выкрутится , для редактирования однострочной строки используют виджет QlineEdit , а у него отсутсвует сигнал clicked(), чем его можно заменить или какой аналог найти виджету чтобы он срабатывал на клик мыши?


Название: Re: QLineEdit
Отправлено: sudo от Март 28, 2012, 11:18
Отловить событие mouseEvent


Название: Re: QLineEdit
Отправлено: Григорий от Март 28, 2012, 11:24
Отловить событие mouseEvent

а можно намек на пример


Название: Re: QLineEdit
Отправлено: sudo от Март 28, 2012, 11:30
Код
C++ (Qt)
void Object::someMethod()
{
 ...
 lineEdit->installEventFilter(this);
 ...
}
 
 
bool Object::eventFilter(QObject* obj, QEvent* event)
{
 if (obj == lineEdit && event->type() == QEvent::MouseButtonPress)
   doSmth();
}
 
 


Название: Re: QLineEdit
Отправлено: Alex_C от Март 28, 2012, 15:19
а можно намек на пример

Книга Марк Шлее "Qt.Программирование на C++".
Глава 15 "Фильтры событий".
Книга есть в инете. Очень советую!
Там кстати в примере как раз QLineEdit+MouseFilter - то, что Вам надо!


Название: Re: QLineEdit
Отправлено: GreatSnake от Март 28, 2012, 15:24
А не проще перегрузить QLineEdit?

Код
C++ (Qt)
class LineEdit : public QLineEdit
{
       Q_OBJECT
public:
    LineEdit( QWidget* parent = 0 ) : QLineEdit( parent ) {}
 
Q_SIGNALS:
       void clicked();
 
protected:
      void mousePressEvent( QMouseEvent* e )
      {
           QLineEdit::mousePressEvent( e );
           emit clicked();
      }
};
 


Название: Re: QLineEdit
Отправлено: sudo от Март 28, 2012, 15:31
Неа. Плодишь ещё один класс и кода больше :) И таскать его придётся за собой


Название: Re: QLineEdit
Отправлено: GreatSnake от Март 28, 2012, 15:43
Неа. Плодишь ещё один класс и кода больше :) И таскать его придётся за собой
А eventFilter() таскать не нужно что-ли? Имхо, eventFilter() это хак.


Название: Re: QLineEdit
Отправлено: Alex_C от Март 28, 2012, 15:47
А что делать, если форма уже нарисована (или рисовать ее хочется) в QtDesigner?  :)
Свои компоненты туда вставлять.
Кстати, почему это хак? На мой взгляд, хак - использование недокументированных методов. Тут же все легально!


Название: Re: QLineEdit
Отправлено: Пантер от Март 28, 2012, 15:49
А что делать, если форма уже нарисована (или рисовать ее хочется) в QtDesigner?  :)
Свои компоненты туда вставлять.
Кстати, почему это хак? На мой взгляд, хак - использование недокументированных методов. Тут же все легально!
Есть promoteTo.


Название: Re: QLineEdit
Отправлено: sudo от Март 28, 2012, 15:56
А eventFilter() таскать не нужно что-ли? Имхо, eventFilter() это хак.

Не вижу смысла писать что-то, что можно легко сделать стандартными средствами


Название: Re: QLineEdit
Отправлено: GreatSnake от Март 28, 2012, 16:00
Не вижу смысла писать что-то, что можно легко сделать стандартными средствами
С чего это eventFilter() стал стандартным средством?
К тому же он решает задачу только для одного конкретного виджета. А если их на форме с десяток?


Название: Re: QLineEdit
Отправлено: GreatSnake от Март 28, 2012, 16:04
Кстати, почему это хак? На мой взгляд, хак - использование недокументированных методов. Тут же все легально!
Да, легальный, но хак)


Название: Re: QLineEdit
Отправлено: sudo от Март 28, 2012, 16:21
С чего это eventFilter() стал стандартным средством?
К тому же он решает задачу только для одного конкретного виджета. А если их на форме с десяток?

Если это есть public API Qt, то почему это не стандартное средство?
Да хоть миллион, всё зависит от задачи и трудоёмкости


Название: Re: QLineEdit
Отправлено: m_ax от Март 28, 2012, 16:33
Я тоже за eventFilter)
Это более гибкое решение в данном случае)


Название: Re: QLineEdit
Отправлено: GreatSnake от Март 28, 2012, 16:42
Я тоже за eventFilter)
Это более гибкое решение в данном случае)
Вот именно, что для данного случая. Но с точки зрения проектирования это костыль.


Название: Re: QLineEdit
Отправлено: Dr.Vlad от Апрель 02, 2012, 19:36
А что делать, если форма уже нарисована (или рисовать ее хочется) в QtDesigner?  :)
Свои компоненты туда вставлять.
Кстати, почему это хак? На мой взгляд, хак - использование недокументированных методов. Тут же все легально!

Запросто можно вставить писаный класс вместо оригинального QLineEdit в ui_class.h
(только, естессна, перед сборкой под релиз, поскольку первая же очистка обнулит сие деяние)
или же в конструкторе блок QGridLayout ваять.


Название: Re: QLineEdit
Отправлено: kambala от Апрель 02, 2012, 20:17
Запросто можно вставить писаный класс вместо оригинального QLineEdit в ui_class.h
запросто можно преобразовать QLineEdit в писаный класс в дизайнере


Название: Re: QLineEdit
Отправлено: Странник от Апрель 03, 2012, 09:51
запросто можно преобразовать QLineEdit в писаный класс в дизайнере
плюсадин. лучше унаследоваться и сигнал прикрутить, чем при каждой необходимости городить eventFilter'ы.


Название: Re: QLineEdit
Отправлено: Dr.Vlad от Апрель 03, 2012, 20:00
class LineEdit : public QLineEdit
{
        Q_OBJECT
public:
        LineEdit( QWidget* parent = 0 ) : QLineEdit( parent ) {}
 
Q_SIGNALS:
        void clicked();
 
protected:
       void mousePressEvent( QMouseEvent* e )
       {
            QLineEdit::mousePressEvent( e );
            emit clicked();
       }
};

Как будто бы здесь eventFilter НЕ используется...

У нас на работе через installEventFilter всё делают,
хотя сама по себе текстовка любопытная, (так или почти так оригинальные troll классы сделаны), запомню.


Название: Re: QLineEdit
Отправлено: Bepec от Апрель 03, 2012, 22:03
Ну как бы этот слот уже определён. А не прогоняет сквозь себя ВСЕ сигналы повторно.


Название: Re: QLineEdit
Отправлено: _OLEGator_ от Апрель 04, 2012, 10:24
У нас на работе через installEventFilter всё делают

И это, имхо, не правильно. Этот механизм скорее для тех, кому влом создавать наследника и там обрабатывать все события, а так было бы правильнее.


Название: Re: QLineEdit
Отправлено: andrew.k от Апрель 05, 2012, 00:25
У нас на работе через installEventFilter всё делают

И это, имхо, не правильно. Этот механизм скорее для тех, кому влом создавать наследника и там обрабатывать все события, а так было бы правильнее.
Не влом, а кому это не нужно.
Нормальный стандартный механизм.


Название: Re: QLineEdit
Отправлено: Bepec от Апрель 05, 2012, 07:11
installEventFilter грузит форму и сигналы. Так же при большом количестве обрабатываемых сигналов (свич из 8 спец элементов допустим), становится сборищем пересекающихся условий и непоняток.
Конечно, если все программисты аккуратны, пишут комментарии и не втыкают через пару дней туда новую функцию, всё будет нормально. Но где ж вы таких видели? :D


Название: Re: QLineEdit
Отправлено: _OLEGator_ от Апрель 05, 2012, 10:37
Не влом, а кому это не нужно.
Нормальный стандартный механизм.

Не нужно = влом. Быстро что-то написать, чтобы работало, наплевав на повторное использование кода. При нормальном проектировании и разработке - надо отдельный класс писать и логику встраивать в него, а не мешать все в кучу. Такой коробочный элемент может быть легко повторно использован.
Конечно, наверняка есть ситуации, когда использование installEventFilter оправдано, но в данном случае это как раз противопоказано.


Название: Re: QLineEdit
Отправлено: andrew.k от Апрель 05, 2012, 10:54
Не влом, а кому это не нужно.
Нормальный стандартный механизм.
Конечно, наверняка есть ситуации, когда использование installEventFilter оправдано, но в данном случае это как раз противопоказано.
Вот именно. Это полноценный метод со своими плюсами и минусами.
Просто начало формироваться мнение, что это какой-то ущербный подход. Словно это GOTO, который есть, но лучше не ипользовать.
Это не так.