Qt, переопределение функций классов
Мой вопрос кроется в чем: если я в QtCreator что-то нарисовал в "дизайнере" и мне нужно переопределить функцию этого контрола(например назначить какое-то событие) - как это сделать? Ведь по дефолту при создании проекта создается лишь класс окна (по дефолту с названием MainWindow(mainwindow.h и mainwindow.cpp).
Поясню еще раз: допустим, я вывел textEdit на форму в дизайнере. Создание объекта данного класса нет нигде в коде, а мне нужно переопределить функцию-обработчик событий для данного контрола. Как это можно сделать?
У конкретного объекта вы метод никак переопределить не сможете. Нужно наследоваться от QTextEdit, например, и уже в своем классе переопределять обработчик. Либо обрабатывать это событие в MainWindow.
Т.е. если я что-то вывел на форму в дизайнере - это уже никак нельзя перебросить в код без собственноручного создания объекта своего класса путем наследования?
P.S. Не помню насчет Qt, а тот же MFC поддерживает Custom Controls. Т.е. создаете собственный контрол и работаете с ним в дизайнере, как с родным.
А в великом и могучем Qt такой простой вещи нельзя было придумать? :( Печально. Не зря я никогда раньше при программировании gui не использовал всякие визуальные дизайнеры.
Цитата: motorw
В winapi вообще события все приходят родительскому окну с ID или handle, которые однозначно определяют поведение объекта при каком-либо произошедшем событии.
А вот это далеко не всегда, не надо. =) Приходит только WM_NOTIFY, и то если включены нотификации.
Цитата: Alexander92
P.S. Не помню насчет Qt, а тот же MFC поддерживает Custom Controls. Т.е. создаете собственный контрол и работаете с ним в дизайнере, как с родным.
В Qt тоже можно
Ой, написал родительскому :) Хотел сказать о том, что для каждого контрола(а это же в winapi по сути - окно) определяется своя windowproc, в которой можно делать что угодно. А тут такого нет :(
Мне кажется речь идет о сигналах и слотах. Они есть. И обработчики в дизайнере для них есть. Где-то внизу справа кажется. Ну и в коде можно в дальнейшем самостоятельно подключить обработчики.
У меня на форме есть QTextEdit и QLabel. Мне нужно сделать так, чтобы когда в QTextEdit было слишком много текста и появился вертикальный скролл, - QLabel переместился бы на verticalScrollBar()->width() влево.
Для этого я унаследовал свой класс от QTextEdit, в нем перегружаю eventFilter, изменяю тип QTextEdit с формы на мой класс и делаю что хочу. По идее все должно выглядеть так. Однако, во-первых это все делается только костылями:
1. Вручную через гуй изменить тип с QTextEdit на свой созданный не удалось(сменилось только название, все то что писал я в своем классе просто не работало).
2. В связи с п.1. выше пришлось лезть в чудом найденный ui_mainwindow.h и в нем править код создания контроллов, в данном случае пришлось менять с QTextEdit на мой класс.
Во-вторых, заработал только конструктор моего класса, eventFilter вообще не работает, словно событий никаких контрол и не получает. Куда копать?
В-третьих, это немного не то, что мне нужно. Все, что я спрашивал выше мне пригодится по другой причине, а у меня сейчас проблема только в одном - я хочу переиначить событие появления вертикального скроллбара в QTextEdit так, чтобы когда он появлялся(у verticalScrollBar срабатывало событие (не знаю пока точно какое), например QEvent::Paint), то QLabel с этой же формы двигался левее от этого скроллбара на его ширину(чтобы они не перекрывались друг другом).
Цитата: motorw
1. Вручную через гуй изменить тип с QTextEdit на свой созданный не удалось(сменилось только название, все то что писал я в своем классе просто не работало).
ПКМ по объекту пункт "Преобразовать в ..."
По п.2 см installEventFilter
ПКМ по "Преобразовать в..." и не работало. Говорю же название менялось, а не работал даже конструктор. Плюс к этому, когда я преобразовал к своему классу, в ui_mainwindow.h контрол все равно был QTextEdit.
Все-таки, как же это чертовски удобно, когда все так хорошо придумали, что тебе остается только пользоваться и думать о реализации программы, а не о возможностях.
Получается, для того, чтобы обрабатывать события самому вовсе необязательно наследовать класс, можно просто сделать installEventFilter родительскому окну и все, обрабатывать все в нем..