crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Вопрос о бинарной совместимости
igor_bogomolov
  опции профиля:
сообщение 15.11.2010, 2:25
Сообщение #1


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Если я существующий не виртуальный метод сделаю виртуальным, нарушит ли это обратную бинарную совместимость?
Конкретно интересует метод
 void QGridLayout::getItemPosition ( int index, int * row, int * column, int * rowSpan, int * columnSpan )


Обратная бинарная совместимость предполагает, что программа собранная с текущей версией библиотеки будет работать с более новыми. QGridLayout абстрактный класс. Преобразование метода из не виртуального в виртуальный, вроде как, не должно ничего изменить?
Подскажите кто знает точно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.11.2010, 3:26
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 15.11.2010, 6:25) *
Если я существующий не виртуальный метод сделаю виртуальным, нарушит ли это обратную бинарную совместимость?
да, поэтому тролей фик заставишь добавить новый метод. Они слоты в этом случае используют
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.11.2010, 7:46
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


igor_bogomolov, можно же просто унаследовать и там уже завиртуалить. Пара строчек - и всё как нужно :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.11.2010, 8:48
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Алексей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, 8:57
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


не знаю, насколько это может помочь, но. В описании функции getItemPosition есть примечание

See also itemAtPosition() and itemAt().

где
QLayoutItem * QGridLayout::itemAt ( int index ) const [virtual]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.11.2010, 9:30
Сообщение #6


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Алексей1153, спасибо конечно за помощь. Но я все это конечно же видел и assistant сам читать умею. Меня интересует конкретный вопрос, который я сформулировал еще в первом сообщении.

Поясню тогда зачем это нужно.
Qt Designer на данный момент не даёт возможности расширять его пользовательскими компоновщиками. И понятно почему. Расширить дизайнер можно только виджетами, а компоновщики ими не являются. После небольших модификаций Qt Designer (добавление нескольких проверок на ноль и удаление пару assert'ов) можно подсунуть ему виджет с встроенным в него компоновщикам (те компоновщики что находятся на панели виджетов на самом деле так и устроенны, но они жестко зашиты в коде).
Но даже после всего этого гибкости не хватает, т.к. типы компоновщиков жестко вшиты в код qt designer'a и работает он только через интерфейсы существующих типов компоновщиков. А мне например нужно вставлять виджет в конкретную ячейку. Это позвалет сделать QGridLayout со своей функцией getItemPosition. И мне было бы достаточно сделать собственную реализацию грида и переопределить этот метод. Но он не виртуальный.
Вот я теперь и не знаю что делать :(

Здесь видео того, что получилось (тык)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.11.2010, 9:50
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(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
   //...
}


или я что-то опять недопонимаю ?

Сообщение отредактировал Алексей1153 - 15.11.2010, 9:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.11.2010, 10:01
Сообщение #8


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Блин, Алексей, зафлудил тему. Читай первое сообщение темы - это то что я хочу выяснить. Юра ответ уже дал, я теперь хочу разобраться почему так.
Читай шестое сообщение темы, что бы понять что я делаю и зачем мне это нужно. Ты в очередной раз вообще не по теме пишешь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 15.11.2010, 11:45
Сообщение #9


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(igor_bogomolov @ 15.11.2010, 2:25) *
Преобразование метода из не виртуального в виртуальный, вроде как, не должно ничего изменить?

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

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

П.С.
если непонятно могу в коде показать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 15.11.2010, 12:12
Сообщение #10


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(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 с данным изменением. Если нет, тупо форкаю дизайнер в своих целях и зашиваю в него свои компоновщики, т.к. нет ни какой возможности добавлять компоновщики через плагин
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.4.2024, 8:17