Поиск:

Ответ в темуСоздание новой темы Создание опроса
> gcc выдает <unknown type> 
V
    Опции темы
N0dwis
Дата 30.4.2008, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 18.9.2007
Где: Луганск

Репутация: нет
Всего: 4



Делаю интерфейс главного окна при помощи QT. Класс такой:
Код

class MainFrame : public QMainWindow, public Ui::MainWindow
{
    Q_OBJECT
public:
    MainFrame();
    ~MainFrame();

private:
    // тип списка контроллеров
    typedef QMap<QMdiSubWindow*, ContactsDatabase*> ControllersList;
    ControllersList controllers;

    QMdiArea *mdiFrame; // центральный виджет

protected slots:
    void newBase(bool checked); // добавить базу
    void addContact(bool checked); // добавить контакт
    void contactsShow(); // вызывается, когда отрисовуется пункт меню контактов
};


Класс Ui::MainWindow сгенерирован designer-ом, вот кусок из него
Код

class Ui_MainWindow
{
public:
    QAction *newBase;
    QAction *openBase;
    QAction *saveBase;
    QAction *saveBaseAs;
    QAction *quit;
    QAction *addContact;
    QAction *deleteContact;
    QAction *editContact;
    QWidget *centralwidget;
    QMenuBar *menubar;
    QMenu *menu;
    QMenu *menuContacts;
    QMenu *menu_3;
    QStatusBar *statusbar;
    QToolBar *toolBar;

    void setupUi(QMainWindow *MainWindow)
    {
    if (MainWindow->objectName().isEmpty())
        MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
    MainWindow->resize(747, 569);
    newBase = new QAction(MainWindow);
    newBase->setObjectName(QString::fromUtf8("newBase"));
.......
}

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui
 


Вот пример проблемного кода:
Код

addContact->setEnabled(false);
deleteContact->setEnabled(false);
editContact->setEnabled(false);

на переменную addContact выдает 
Код

src\MainFrame.cpp:76: error: invalid use of member (did you forget the `&' ?)
src\MainFrame.cpp:76: error: base operand of `->' is not a pointer

а две остальные строки - без проблем! При попытке подключить слот к какому-либо сигналу addContact, выдает <unknown type>. Такая же ситуация с переменной newBase, остальные еще не проверял.
Я думаю, дело в том, что компилятор не может определить тип addContact, но почему??
PM MAIL   Вверх
N0dwis
Дата 30.4.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 18.9.2007
Где: Луганск

Репутация: нет
Всего: 4



Только что обнаружил, если класс MainFrame не наследовать от Ui::MainWindow, а объявлять поле такого типа:
Код

class MainFrame : public QMainWindow //, public Ui::MainWindow
{
    Q_OBJECT
public:
    MainFrame();
    ~MainFrame();

private:
    // тип списка контроллеров
    typedef QMap<QMdiSubWindow*, ContactsDatabase*> ControllersList;
    ControllersList controllers;

    QMdiArea *mdiFrame; // центральный виджет
    Ui::MainWindow mainW;

protected slots:
    void newBase(bool checked); // добавить базу
    void addContact(bool checked); // добавить контакт
    void contactsShow(); // вызывается, когда отрисовуется пункт меню контактов
};


то обращение
Код

mainW.addContact->setEnabled(false);
mainW.deleteContact->setEnabled(false);
mainW.editContact->setEnabled(false);

Проходит нормально.
В чем же грабли с наследованием?
PM MAIL   Вверх
xvr
Дата 30.4.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(N0dwis @ 30.4.2008,  09:27)
Делаю интерфейс главного окна при помощи QT. Класс такой:
Код

class MainFrame : public QMainWindow, public Ui::MainWindow
{
    void newBase(bool checked); // добавить базу
    void addContact(bool checked); // добавить контакт
    void contactsShow(); // вызывается, когда отрисовуется пункт меню контактов
};


Класс Ui::MainWindow сгенерирован designer-ом, вот кусок из него
Код

class Ui_MainWindow
{
public:
    QAction *addContact;
}



Вот пример проблемного кода:
Код

addContact->setEnabled(false);
deleteContact->setEnabled(false);
editContact->setEnabled(false);

на переменную addContact выдает 
Код

src\MainFrame.cpp:76: error: invalid use of member (did you forget the `&' ?)
src\MainFrame.cpp:76: error: base operand of `->' is not a pointer

а две остальные строки - без проблем! 

Функция MainFrame::addContact перебивает поле Ui::MainWindow::addContact, пиши так
Код

Ui::MainWindow::addContact->setEnabled(false);

PM MAIL   Вверх
N0dwis
Дата 30.4.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 18.9.2007
Где: Луганск

Репутация: нет
Всего: 4



Спасибо, работает...
Но вот почему не со всеми переменными такой глюк??
PM MAIL   Вверх
JackYF
Дата 30.4.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(N0dwis @  30.4.2008,  12:35 Найти цитируемый пост)
Но вот почему не со всеми переменными такой глюк?? 

Это не глюк. Когда компилятора две версии того, что надо вызывать, ты обязан указать ему, из какого именно класса/пространства имён нужно вызвать функцию.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 30.4.2008, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 11
Всего: 93



Цитата(xvr @  30.4.2008,  11:55 Найти цитируемый пост)
Ui::MainWindow::addContact->setEnabled(false);

Лучше(понятнее для читающего) так:
Код

this->MainWindow::addContact->setEnabled(false);



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
XavierElf
Дата 1.5.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: нет
Всего: 1



Цитата(N0dwis @  30.4.2008,  09:27 Найти цитируемый пост)

protected slots:
    void newBase(bool checked); // добавить базу
    void addContact(bool checked); // добавить контакт
    void contactsShow(); // вызывается, когда отрисовуется пункт меню контактов

А какой смысл это всё объявлять как слоты если нет сигналов с которыми их связывать? Можно объявить их просто как методы класса.
А если нужно чтоб они связывались с виджетами не форме проще создать слоты:
Код

protected slots:
    void on_newBase_triggered(bool checked); // добавить базу
    void on_addContact_triggered(bool checked); // добавить контакт

Тогда не придётся вызывать connect(...), будет автоматически вызван метод connectSlotsByName().
ЗЫ: просто если называть методы и обекты одним именем у некоторых компиляторов возникают проблемы.

Это сообщение отредактировал(а) XavierElf - 1.5.2008, 23:21
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
N0dwis
Дата 2.5.2008, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 18.9.2007
Где: Луганск

Репутация: нет
Всего: 4



Цитата(JackYF @  30.4.2008,  14:39 Найти цитируемый пост)
Это не глюк. Когда компилятора две версии того, что надо вызывать, ты обязан указать ему, из какого именно класса/пространства имён нужно вызвать функцию. 

Во-первых, что значит "две версии"? Эти переменные существуют в единственном экземпляре в классе-предке. Уточнение пространства имен могу понять при переопределении функции для вызова функции предка, но переменные... 

Цитата(XavierElf @  1.5.2008,  23:11 Найти цитируемый пост)
А если нужно чтоб они связывались с виджетами не форме проще создать слоты:

Да, я потом к ним подключаю сигналы пунктов меню. За наводку спасибо, про такое я не знал.


Цитата(XavierElf @  1.5.2008,  23:11 Найти цитируемый пост)
ЗЫ: просто если называть методы и обекты одним именем у некоторых компиляторов возникают проблемы.

 smile
Только дошло!!!! Как-то не обратил внимание, что дал одинаковые названия слотам и полям... smile 
Спасибо всем!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.