Russian Qt Forum

Qt => Общие вопросы => Тема начата: GraninDm от Сентябрь 03, 2015, 10:00



Название: Вызов protected метода
Отправлено: 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)
 ^

Как избавиться от этих варнингов?


Название: Re: Вызов protected метода
Отправлено: Tuxford от Сентябрь 03, 2015, 10:22
Pretected метод можно вызывать или в самом классе или в унаследовано. Такой код как вы привели понятное дело не компилябельный. А вызывается этот метод как таким образом как я писал или ключевою слово friend:
См. код:
Код:
class Q_SQL_EXPORT QSqlResult
{
    Q_DECLARE_PRIVATE(QSqlResult)
    friend class QSqlQuery;
    friend class QSqlTableModelPrivate;


Название: Re: Вызов protected метода
Отправлено: GraninDm от Сентябрь 03, 2015, 10:28
Я это понимаю.
Но это не мой код.
Это исходник Qt.

Как же он у них компилируется?


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


Название: Re: Вызов protected метода
Отправлено: Tuxford от Сентябрь 03, 2015, 10:40
Я это понимаю.
Но это не мой код.
Это исходник Qt.

Как же он у них компилируется?
Коню понятно, что это исходник Qt. Я ответил на ваш вопрос почему оно там работает.
Если не знакомы что такое дружественность в С++, вот статья: http://cppstudio.com/post/8423/


Название: Re: Вызов protected метода
Отправлено: GraninDm от Сентябрь 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. Это не мой код.

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

Все. Прошу прощенья. Дошло.