Russian Qt Forum
Ноябрь 01, 2024, 03:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вызов protected метода  (Прочитано 5501 раз)
GraninDm
Гость
« : Сентябрь 03, 2015, 10:00 »

Добрый день!

Решил я на днях попробовать написать свою модель на основе исходников QSqlTableModel.

Скопировал исходники QSqlTableModel, переобозвал QSqlTableModel по своему - EditSqlQueryModel.
Подключил core-private
Компилирую и получаю такую ошибку
C:\Qt\Qt5.4.2\5.4\mingw491_32\include\QtSql\qsqlresult.h:122: ошибка: 'virtual void QSqlResult::detachFromResultSet()' is protected
     virtual void detachFromResultSet();
                  ^
Смотрю исходник
Код:
class Q_SQL_EXPORT QSqlResult
{
...
protected:
    virtual void detachFromResultSet();
...

Код где вызывается этот метод
Код:
bool EditSqlQueryModelPrivate::exec(const QString &stmt, bool prepStatement,
                                 const QSqlRecord &rec, const QSqlRecord &whereValues)
{
    if (stmt.isEmpty())
        return false;

    // lazy initialization of editQuery
    if (editQuery.driver() != db.driver())
        editQuery = QSqlQuery(db);

    // workaround for In-Process databases - remove all read locks
    // from the table to make sure the editQuery succeeds
    if (db.driver()->hasFeature(QSqlDriver::SimpleLocking))
        const_cast<QSqlResult *>(query.result())->detachFromResultSet();
Как же этот код компилируется в исходниках Qt?

Что сделать, чтобы скомпилировалось?

И еще куча варнингов типа
Z:\Coding\qt\EditSqlQueryModel_Test\editsqlquerymodel.cpp:155: предупреждение: 'EditSqlQueryModel::EditSqlQueryModel(QObject*, QSqlDatabase)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes]
 EditSqlQueryModel::EditSqlQueryModel(QObject *parent, QSqlDatabase db)
 ^

Как избавиться от этих варнингов?
Записан
Tuxford
Гость
« Ответ #1 : Сентябрь 03, 2015, 10:22 »

Pretected метод можно вызывать или в самом классе или в унаследовано. Такой код как вы привели понятное дело не компилябельный. А вызывается этот метод как таким образом как я писал или ключевою слово friend:
См. код:
Код:
class Q_SQL_EXPORT QSqlResult
{
    Q_DECLARE_PRIVATE(QSqlResult)
    friend class QSqlQuery;
    friend class QSqlTableModelPrivate;
Записан
GraninDm
Гость
« Ответ #2 : Сентябрь 03, 2015, 10:28 »

Я это понимаю.
Но это не мой код.
Это исходник Qt.

Как же он у них компилируется?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 03, 2015, 10:38 »

Как же он у них компилируется?
Вызывается из friend классов. Это должно насторожить, очень может быть что самому его вызывать не следует, это против замысла авторов. Ну а если "вот НАДО - и все!" тогда такой финт 
Код
C++ (Qt)
class MySqlResult : public QSqlResult
{
public:
   using detachFromResultSet;
};
...
static_cast<MySqlResult *>(query.result())->detachFromResultSet();
Записан
Tuxford
Гость
« Ответ #4 : Сентябрь 03, 2015, 10:40 »

Я это понимаю.
Но это не мой код.
Это исходник Qt.

Как же он у них компилируется?
Коню понятно, что это исходник Qt. Я ответил на ваш вопрос почему оно там работает.
Если не знакомы что такое дружественность в С++, вот статья: http://cppstudio.com/post/8423/
Записан
GraninDm
Гость
« Ответ #5 : Сентябрь 03, 2015, 10:43 »

Правильно...
Вот строка вызова
Код:
const_cast<QSqlResult *>(query.result())->detachFromResultSet();


detachFromResultSet() вызывается из класса QSqlResult

Класс QSqlResult это friend class для QSqlResult
Код:
class Q_SQL_EXPORT QSqlResult
{
    Q_DECLARE_PRIVATE(QSqlResult)
    friend class QSqlQuery;
Я еще раз подчеркиваю - это все код Qt. Это не мой код.

Так, чет я ерунду написал. Пошел пока думать...

Все. Прошу прощенья. Дошло.
« Последнее редактирование: Сентябрь 03, 2015, 10:47 от GraninDm » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.064 секунд. Запросов: 22.