crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QList не "переносится" из плагина
gigabyte
  опции профиля:
сообщение 9.8.2009, 21:47
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 9.8.2009
Пользователь №: 992

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




Репутация:   1  


Здравствуйте уважаемые знатоки. Опять же о тонкостях Qt(MinGW + Qt 4.5.1 + Eclipse + Qt Integration)
До этого момента использовал Qt plugin непосредственно т.е. QPluginLoader->instance() теперь же использую для создания компонентов фабрику т.е.
WidgetFactory = QPluginLoader->instance();
WidgetFactory->newInstance()

Но тут появилась проблема, до того как перешел на использование фабрики в класс выглядел следующим образом:
class tableview : public QTableView, public ViewInterface
{
    Q_OBJECT
    Q_INTERFACES(ViewInterface)
public:
    tableview(QWidget *parent = 0);
    ~tableview();

    void setPluginParameters(QMap<QString,QVariant> params);
    QString getViewName() const;
    QString getViewDesc() const;

    /*Commands for passing SQL and other data*/
    QVariant* getViewCmd() const;
    void setViewCmd(const QVariant *viewCmd);
    QWidget* acquireWidget() const;

    /*Universal UI commands*/
    void uiButtons(QList<int> btns);
//    QList<int>* uiButtons() const;
    bool invoke_uiButton(int btn) const;
private slots:
    void filterBtnClicked(int logicalIndex);
private:
    TVtableheader * header;
    QVariant * cmd;
    QSqlDatabase *db;
    CoreInterface *Core;
    QList<int>* uiBtns;
    void getCaptions();
    void translateModel();
    QMap<QString,QString> *Captions;
    QString *view;
    QSqlQueryModel *model;

};

обратите внимание на метод void uiButtons(QList<int> btns); - метод интерфейса ViewInterface.
Значит до использования фабрики этот метод работал нормально - т.е. возвращал Список идентификаторов кнопок которые следует отображать,
сейчас же он возвращает пустой список.
В чем может быть проблема?
P.S. Как видите раньше использовалась функция возвращающая указатель на список но сейчас заменил на процедуру так как думал что проблема в указателях. Но этот трюк также не проходит
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.8.2009, 21:53
Сообщение #2


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Тут дело не в Qt, а в C++. Почитай по поводу ссылок.
void uiButtons(QList<int>& btns);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gigabyte
  опции профиля:
сообщение 9.8.2009, 22:03
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 9.8.2009
Пользователь №: 992

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




Репутация:   1  


Цитата(BRE @ 9.8.2009, 21:53) *
Тут дело не в Qt, а в C++. Почитай по поводу ссылок.

void uiButtons(QList<int>& btns);


Если вы рекомендуете добавить & в метод, - то не помогло только что сделал

Цитата(BRE @ 9.8.2009, 21:53) *
Тут дело не в Qt, а в C++. Почитай по поводу ссылок.

void uiButtons(QList<int>& btns);

Только что хотел попробовать через указатели т.е.
void uiButtons(QList<int> * btns);

А потом в коде програаммы:
QList<int> btns;
widget->uiButtons(&btns);

Тоже не помогло
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.8.2009, 22:03
Сообщение #4


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(gigabyte @ 9.8.2009, 22:58) *
Если вы рекомендуете добавить & в метод, - то не помогло только что сделал

А покажи, как реализован uiButtons.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gigabyte
  опции профиля:
сообщение 9.8.2009, 22:08
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 9.8.2009
Пользователь №: 992

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




Репутация:   1  


Цитата(BRE @ 9.8.2009, 22:03) *
А покажи, как реализован uiButtons.

void tableview::uiButtons(QList<int>* btns)
{
if(!btns->isEmpty()) {btns->clear();}
*btns = *this->uiBtns;
//return this->uiBtns;
}


ААА блин опять [ code ] [ /code ] забыл
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.8.2009, 22:13
Сообщение #6


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

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

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




Репутация:   94  


Цитата(gigabyte @ 10.8.2009, 1:47) *
т.е. возвращал Список идентификаторов
этот метод ничего не возвращает, он void

сделай так:
typedef QList<int> IntList;
IntList uiButtons();
тогда любому человеку будет понятно, что этот метод возвращает список кнопок

Цитата(gigabyte @ 10.8.2009, 2:08) *
ААА блин опять [ code ] [ /code ] забыл
Смотри Справка по кнопкам и тэгам форума
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.8.2009, 22:27
Сообщение #7


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


void tableview::uiButtons(QList<int>* btns)
{
    if(!btns->isEmpty()) {btns->clear();}    // Эта строка не нужна, после присвоения списки будут одинаковыми
    *btns = *this->uiBtns;
    //return this->uiBtns;
}

А точно uiBtns не пустой в этот момент?
Попробуй добавить вывод qDebug() << *uiBtns << *btns до и после присвоения.

Цитата(Litkevich Yuriy @ 9.8.2009, 23:13) *
сделай так:
typedef QList<int> IntList;
IntList uiButtons();

тогда любому человеку будет понятно, что этот метод возвращает список кнопок

+1
Думаю это будет самый лучший вариант.
IntList uiButtons() const
{
    return *uiBtns;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gigabyte
  опции профиля:
сообщение 10.8.2009, 10:47
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 9.8.2009
Пользователь №: 992

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




Репутация:   1  


Разобрался, заменил в коде который вызывает плагин приведение типов:
ViewInterface* interface = (ViewInterface *)qvariant_cast<QObject *>(obj);

на
ViewInterface* interface = qobject_cast<ViewInterface *>(qvariant_cast<QObject *>(obj));

P.S. Очень уж Qt щепетильно относится к привидению типов <_< Delphi в этом смысле более лоялен к кодировщику
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 10.8.2009, 10:49
Сообщение #9


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(gigabyte @ 10.8.2009, 11:47) *
P.S. Очень уж Qt щепетильно относится к привидению типов <_< Delphi в этом смысле более лоялен к кодировщику

Ошибки во время компиляции легче найти и исправить, чем ошибки во время выполнения! Тем более, логические ошибки! ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.8.2009, 19:23
Сообщение #10


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

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

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




Репутация:   94  


Цитата(gigabyte @ 10.8.2009, 14:47) *
qobject_cast<ViewInterface *>(qvariant_cast<QObject *>(obj));
а зачем одно приведение типа вложено в другое?
qobject_cast<ViewInterface *>(obj);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 27.4.2024, 13:23