Здравствуйте, гость ( Вход | Регистрация )
igor_bogomolov | Дата 15.11.2010, 13:28 |
а пример методов получивших виртуальность в процессе развития библиотеки искать не пробовал? нет, и даже не знаю как найти |
|
kwisp | Дата 15.11.2010, 12:23 |
Никаких виртуальных функций getItemPosition не вызывает. понятно. Если можно, а буду счастлив и дождусь следующего релиза Qt с данным изменением. я теперь только понял, что именно ты хочешь сделать. даже если это будет обеспечиваться обратная бинарная совместимость, тролли могут отказать имея свои планы развития этого класса и + то что я писал про нарушение логики работы. а пример методов получивших виртуальность в процессе развития библиотеки искать не пробовал? |
|
igor_bogomolov | Дата 15.11.2010, 12:12 |
К сожалению исходников qt нет под рукой Исходники всегда доступны http://qt.gitorious.org/qt/qt/blobs/4.7/sr...qgridlayout.cppНикаких виртуальных функций getItemPosition не вызывает. Просто эту функцию дёргает qt designer в момент генерации ui файла. Если точнее, сначала проверяется можно ли преобразовать компоновщик к QGridLayout. Если можно - преобразуется и запрашивается row, column, rowSpan, columnSpan функцией getItemPosition вот кусок кода дизайнера, где это происходит Раскрывающийся текст
Мне нужно, что бы вызвалась моя реализация getItemPosition. Это возможно если только она будет виртуальной. Теперь вопрос только в том, а можно ли её сделать виртуальной? Потому что если это нарушит бинарную совместимость, троли пошлют меня далеко. Если можно, а буду счастлив и дождусь следующего релиза Qt с данным изменением. Если нет, тупо форкаю дизайнер в своих целях и зашиваю в него свои компоновщики, т.к. нет ни какой возможности добавлять компоновщики через плагин |
|
kwisp | Дата 15.11.2010, 11:45 |
Преобразование метода из не виртуального в виртуальный, вроде как, не должно ничего изменить? не знаю как бинарную совместимость, но логику работы определенных классов нарушить может. допустим в новой версии библиотеки в наследнике абстрактного класса добавляется, как и задумано разработчиками, невиртуальный одноименный метод, ты же в свою очередь сделав этот метод виртуальным не сможешь контролировать вызовы внутри библиотеки через указатель на абстрактный класс. т.е. разработчики библиотеки планировали что вызовется метод базового класса, а у тебя вызовется метод дочернего. по задаче можно предположить что getItemPosition вызывает какие-то виртуальный функции, и переопределив их можно добиться желаемого поведения. Примером этого служит паттерн невиртуального интерфейса. тролли его неособо жалуют конечно. К сожалению исходников qt нет под рукой. кинь сюда реализацию QGrifLayout и его предков - вместе покурим. П.С. если непонятно могу в коде показать. |
|
igor_bogomolov | Дата 15.11.2010, 10:01 |
Блин, Алексей, зафлудил тему. Читай первое сообщение темы - это то что я хочу выяснить. Юра ответ уже дал, я теперь хочу разобраться почему так. Читай шестое сообщение темы, что бы понять что я делаю и зачем мне это нужно. Ты в очередной раз вообще не по теме пишешь |
|
Алексей1153 | Дата 15.11.2010, 9:50 |
Меня интересует конкретный вопрос, который я сформулировал еще в первом сообщении я понимаю, конечно, что меня пытаются вежливо послать Но всё равно пусть QGridLayout* pL - указатель на объект потомок.
или я что-то опять недопонимаю ? |
|
igor_bogomolov | Дата 15.11.2010, 9:30 |
Алексей1153, спасибо конечно за помощь. Но я все это конечно же видел и assistant сам читать умею. Меня интересует конкретный вопрос, который я сформулировал еще в первом сообщении. Поясню тогда зачем это нужно. Qt Designer на данный момент не даёт возможности расширять его пользовательскими компоновщиками. И понятно почему. Расширить дизайнер можно только виджетами, а компоновщики ими не являются. После небольших модификаций Qt Designer (добавление нескольких проверок на ноль и удаление пару assert'ов) можно подсунуть ему виджет с встроенным в него компоновщикам (те компоновщики что находятся на панели виджетов на самом деле так и устроенны, но они жестко зашиты в коде). Но даже после всего этого гибкости не хватает, т.к. типы компоновщиков жестко вшиты в код qt designer'a и работает он только через интерфейсы существующих типов компоновщиков. А мне например нужно вставлять виджет в конкретную ячейку. Это позвалет сделать QGridLayout со своей функцией getItemPosition. И мне было бы достаточно сделать собственную реализацию грида и переопределить этот метод. Но он не виртуальный. Вот я теперь и не знаю что делать Здесь видео того, что получилось (тык) |
|
Алексей1153 | Дата 15.11.2010, 8:57 |
не знаю, насколько это может помочь, но. В описании функции getItemPosition есть примечание See also itemAtPosition() and itemAt(). где QLayoutItem * QGridLayout::itemAt ( int index ) const [virtual] |
|
igor_bogomolov | Дата 15.11.2010, 8:48 |
Алексей1153, Мне нужно иметь возможность обратиться к собственной реализации getItemPosition через указатель на базовый класс, т.е. через указатель на QGridLayout. да, поэтому тролей фик заставишь добавить новый метод. Они слоты в этом случае используют Блин. Вот это облом А можно чуть поподробнее почему так? Я не очень разбираюсь в вопросах бинарной совместимости. Я читал этот документ (BinaryCompatibilityWorkarounds), но как то он мне ясности не прибавил. тролей фик заставишь добавить новый метод. Я же не добавляю новый метод. Я всего лишь существующий хочу сделать виртуальным. Т.е. превратить в
----добавлено---- Почитал еще Policies/Binary Compatibility Issues With C++, тут тоже не нашел прямого запрета на мою модификацию |
|
Алексей1153 | Дата 15.11.2010, 7:46 |
igor_bogomolov, можно же просто унаследовать и там уже завиртуалить. Пара строчек - и всё как нужно | |
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 1.5.2024, 13:10 |