Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Qt, переопределение функций классов

9.1K
21 августа 2011 года
motorw
134 / / 15.12.2009
Всем добрый день. Во-первых. очень удивлен, что еще нет раздела для Qt. Ну да ладно.
Мой вопрос кроется в чем: если я в QtCreator что-то нарисовал в "дизайнере" и мне нужно переопределить функцию этого контрола(например назначить какое-то событие) - как это сделать? Ведь по дефолту при создании проекта создается лишь класс окна (по дефолту с названием MainWindow(mainwindow.h и mainwindow.cpp).

Поясню еще раз: допустим, я вывел textEdit на форму в дизайнере. Создание объекта данного класса нет нигде в коде, а мне нужно переопределить функцию-обработчик событий для данного контрола. Как это можно сделать?
394
21 августа 2011 года
MegaMozg
317 / / 18.03.2006
У конкретного объекта вы метод никак переопределить не сможете. Нужно наследоваться от QTextEdit, например, и уже в своем классе переопределять обработчик. Либо обрабатывать это событие в MainWindow.
9.1K
21 августа 2011 года
motorw
134 / / 15.12.2009
Т.е. если я что-то вывел на форму в дизайнере - это уже никак нельзя перебросить в код без собственноручного создания объекта своего класса путем наследования?
278
21 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Метод можно переопределить только в производном классе. А дизайнер формы использует фиксированный базовый класс. Поэтому и нельзя.

P.S. Не помню насчет Qt, а тот же MFC поддерживает Custom Controls. Т.е. создаете собственный контрол и работаете с ним в дизайнере, как с родным.
9.1K
21 августа 2011 года
motorw
134 / / 15.12.2009
Нет, ну просто, например, в c++ builder есть события типа onchange onclick и так далее, т.е. переопределять ничего не надо. В javascript Тоже. В winapi вообще события все приходят родительскому окну с ID или handle, которые однозначно определяют поведение объекта при каком-либо произошедшем событии.

А в великом и могучем Qt такой простой вещи нельзя было придумать? :( Печально. Не зря я никогда раньше при программировании gui не использовал всякие визуальные дизайнеры.
278
21 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: motorw

В winapi вообще события все приходят родительскому окну с ID или handle, которые однозначно определяют поведение объекта при каком-либо произошедшем событии.


А вот это далеко не всегда, не надо. =) Приходит только WM_NOTIFY, и то если включены нотификации.

394
21 августа 2011 года
MegaMozg
317 / / 18.03.2006
Цитата: Alexander92

P.S. Не помню насчет Qt, а тот же MFC поддерживает Custom Controls. Т.е. создаете собственный контрол и работаете с ним в дизайнере, как с родным.



В Qt тоже можно

9.1K
21 августа 2011 года
motorw
134 / / 15.12.2009
Ой, написал родительскому :) Хотел сказать о том, что для каждого контрола(а это же в winapi по сути - окно) определяется своя windowproc, в которой можно делать что угодно. А тут такого нет :(
14
21 августа 2011 года
Phodopus
3.3K / / 19.06.2008
Мне кажется речь идет о сигналах и слотах. Они есть. И обработчики в дизайнере для них есть. Где-то внизу справа кажется. Ну и в коде можно в дальнейшем самостоятельно подключить обработчики.
9.1K
21 августа 2011 года
motorw
134 / / 15.12.2009
Продолжаю беседу.
У меня на форме есть QTextEdit и QLabel. Мне нужно сделать так, чтобы когда в QTextEdit было слишком много текста и появился вертикальный скролл, - QLabel переместился бы на verticalScrollBar()->width() влево.

Для этого я унаследовал свой класс от QTextEdit, в нем перегружаю eventFilter, изменяю тип QTextEdit с формы на мой класс и делаю что хочу. По идее все должно выглядеть так. Однако, во-первых это все делается только костылями:
1. Вручную через гуй изменить тип с QTextEdit на свой созданный не удалось(сменилось только название, все то что писал я в своем классе просто не работало).
2. В связи с п.1. выше пришлось лезть в чудом найденный ui_mainwindow.h и в нем править код создания контроллов, в данном случае пришлось менять с QTextEdit на мой класс.

Во-вторых, заработал только конструктор моего класса, eventFilter вообще не работает, словно событий никаких контрол и не получает. Куда копать?

В-третьих, это немного не то, что мне нужно. Все, что я спрашивал выше мне пригодится по другой причине, а у меня сейчас проблема только в одном - я хочу переиначить событие появления вертикального скроллбара в QTextEdit так, чтобы когда он появлялся(у verticalScrollBar срабатывало событие (не знаю пока точно какое), например QEvent::Paint), то QLabel с этой же формы двигался левее от этого скроллбара на его ширину(чтобы они не перекрывались друг другом).
277
21 августа 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: motorw

1. Вручную через гуй изменить тип с QTextEdit на свой созданный не удалось(сменилось только название, все то что писал я в своем классе просто не работало).


ПКМ по объекту пункт "Преобразовать в ..."
По п.2 см installEventFilter

9.1K
21 августа 2011 года
motorw
134 / / 15.12.2009
ПКМ по "Преобразовать в..." и не работало. Говорю же название менялось, а не работал даже конструктор. Плюс к этому, когда я преобразовал к своему классу, в ui_mainwindow.h контрол все равно был QTextEdit.
9.1K
21 августа 2011 года
motorw
134 / / 15.12.2009
По поводу второго пункта - большое спасибо!
Все-таки, как же это чертовски удобно, когда все так хорошо придумали, что тебе остается только пользоваться и думать о реализации программы, а не о возможностях.

Получается, для того, чтобы обрабатывать события самому вовсе необязательно наследовать класс, можно просто сделать installEventFilter родительскому окну и все, обрабатывать все в нем..
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог