crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Вопрос о бинарной совместимости
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
igor_bogomolov Дата 15.11.2010, 13:28
 
Цитата(kwisp @ 15.11.2010, 12:23) *
а пример методов получивших виртуальность в процессе развития библиотеки искать не пробовал?
нет, и даже не знаю как найти :)
kwisp Дата 15.11.2010, 12:23
 
Цитата(igor_bogomolov @ 15.11.2010, 12:12) *
Никаких виртуальных функций getItemPosition не вызывает.

понятно.
Цитата(igor_bogomolov @ 15.11.2010, 12:12) *
Если можно, а буду счастлив и дождусь следующего релиза Qt с данным изменением.

я теперь только понял, что именно ты хочешь сделать.
даже если это будет обеспечиваться обратная бинарная совместимость, тролли могут отказать имея свои планы развития этого класса и + то что я писал про нарушение логики работы.

а пример методов получивших виртуальность в процессе развития библиотеки искать не пробовал?
igor_bogomolov Дата 15.11.2010, 12:12
 
Цитата(kwisp @ 15.11.2010, 11:45) *
К сожалению исходников qt нет под рукой
Исходники всегда доступны :) http://qt.gitorious.org/qt/qt/blobs/4.7/sr...qgridlayout.cpp

Никаких виртуальных функций getItemPosition не вызывает. Просто эту функцию дёргает qt designer в момент генерации ui файла. Если точнее, сначала проверяется можно ли преобразовать компоновщик к QGridLayout. Если можно - преобразуется и запрашивается row, column, rowSpan, columnSpan функцией getItemPosition

вот кусок кода дизайнера, где это происходит
Раскрывающийся текст
        if (QGridLayout *grid = qobject_cast<QGridLayout*>(m_chain.top())) {
            const int index = Utils::indexOfWidget(grid, item->widget());

            int row, column, rowspan, colspan;
            grid->getItemPosition(index, &row, &column, &rowspan, &colspan);
            ui_item->setAttributeRow(row);
            ui_item->setAttributeColumn(column);

            if (colspan != 1)
                ui_item->setAttributeColSpan(colspan);

            if (rowspan != 1)
                ui_item->setAttributeRowSpan(rowspan);


Мне нужно, что бы вызвалась моя реализация getItemPosition. Это возможно если только она будет виртуальной.

Теперь вопрос только в том, а можно ли её сделать виртуальной? Потому что если это нарушит бинарную совместимость, троли пошлют меня далеко.
Если можно, а буду счастлив и дождусь следующего релиза Qt с данным изменением. Если нет, тупо форкаю дизайнер в своих целях и зашиваю в него свои компоновщики, т.к. нет ни какой возможности добавлять компоновщики через плагин
kwisp Дата 15.11.2010, 11:45
 
Цитата(igor_bogomolov @ 15.11.2010, 2:25) *
Преобразование метода из не виртуального в виртуальный, вроде как, не должно ничего изменить?

не знаю как бинарную совместимость, но логику работы определенных классов нарушить может.
допустим в новой версии библиотеки в наследнике абстрактного класса добавляется, как и задумано разработчиками, невиртуальный одноименный метод, ты же в свою очередь сделав этот метод виртуальным не сможешь контролировать вызовы внутри библиотеки через указатель на абстрактный класс. т.е. разработчики библиотеки планировали что вызовется метод базового класса, а у тебя вызовется метод дочернего.

по задаче можно предположить что getItemPosition вызывает какие-то виртуальный функции, и переопределив их можно добиться желаемого поведения. Примером этого служит паттерн невиртуального интерфейса. тролли его неособо жалуют конечно.
К сожалению исходников qt нет под рукой. кинь сюда реализацию QGrifLayout и его предков - вместе покурим.

П.С.
если непонятно могу в коде показать.
igor_bogomolov Дата 15.11.2010, 10:01
  Блин, Алексей, зафлудил тему. Читай первое сообщение темы - это то что я хочу выяснить. Юра ответ уже дал, я теперь хочу разобраться почему так.
Читай шестое сообщение темы, что бы понять что я делаю и зачем мне это нужно. Ты в очередной раз вообще не по теме пишешь
Алексей1153 Дата 15.11.2010, 9:50
 
Цитата(igor_bogomolov @ 15.11.2010, 11:30) *
Меня интересует конкретный вопрос, который я сформулировал еще в первом сообщении


я понимаю, конечно, что меня пытаются вежливо послать :) Но всё равно

пусть QGridLayout* pL - указатель на объект потомок.

for(int i=0;i<pL->count();i++)
{
   QLayoutItem* pI=takeAt(i);
   //а это уже указатель на твой item.
   //можно по указателю произвести поиск среди таблицы айтемов потомка
   //и вытащить оттуда искомые int * row, int * column, int * rowSpan, int * columnSpan
   //...
}


или я что-то опять недопонимаю ?
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.

Цитата(Litkevich Yuriy @ 15.11.2010, 3:26) *
да, поэтому тролей фик заставишь добавить новый метод. Они слоты в этом случае используют
Блин. Вот это облом :(

А можно чуть поподробнее почему так? Я не очень разбираюсь в вопросах бинарной совместимости.
Я читал этот документ (BinaryCompatibilityWorkarounds), но как то он мне ясности не прибавил.

Цитата(Litkevich Yuriy @ 15.11.2010, 3:26) *
тролей фик заставишь добавить новый метод.
Я же не добавляю новый метод. Я всего лишь существующий хочу сделать виртуальным. Т.е.
void QGridLayout::getItemPosition ( int index, int * row, int * column, int * rowSpan, int * columnSpan )
превратить в
virtual void QGridLayout::getItemPosition ( int index, int * row, int * column, int * rowSpan, int * columnSpan )


----добавлено----

Почитал еще Policies/Binary Compatibility Issues With C++, тут тоже не нашел прямого запрета на мою модификацию
Алексей1153 Дата 15.11.2010, 7:46
  igor_bogomolov, можно же просто унаследовать и там уже завиртуалить. Пара строчек - и всё как нужно :)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 1.5.2024, 13:10