crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Проблема с подключением слота
dr-jazz
  опции профиля:
сообщение 21.11.2011, 1:08
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 21.11.2011
Пользователь №: 3015

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




Репутация:   0  


Добрый день!

Начал изучать С++ и Qt... пока только основы и начало.

Пытаюсь разобраться с добавлением вкладок в QTabWidget.
Идея в том, что существует кнопка и панель со вкладками.
При нажатии кнопки вкладки добавляются на панель.

Для этого я объявляю класс наследующий QTabWidget и в нем добавляю слот, который позволяет добавление вкладок.

После этого коннект и все должно работать, но не работает. Кнопку нажимаю, но вкладки при этом не добавляются.

Очень нуждаюсь в подсказке, что же у меня не так.

Спасибо заранее.

Код привожу ниже.


#include<QtGui>

class myTabWidget : public QTabWidget
{

public slots:
    void plusTab();
};

void myTabWidget::plusTab()
{
    this->addTab(new QLabel("new tab", this), "new tab");
}


int main(int argc, char *argv[])
{

    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("Add/Remove Tabs");


    QVBoxLayout *layout = new QVBoxLayout;

    myTabWidget *tab = new myTabWidget;
    QPushButton *pb_add = new QPushButton;

    pb_add->setText("+");
//    tab->addTab(new QLabel("new tab", tab), "new tab");

    int num = 0;

    QObject::connect(pb_add, SIGNAL(clicked()), tab, SLOT(plusTab()));


    layout->addWidget(tab);
    layout->addWidget(pb_add);

    window->setLayout(layout);

    window->show();

    return app.exec();

}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 21.11.2011, 1:48
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


А зачем вы предопределяете QTabWidget?
Создайте проект в дизайнере Qt Creator'a. Там будет все проще.

Пример:

Прикрепленные файлы
Прикрепленный файл  tabs.zip ( 1.72 килобайт ) Кол-во скачиваний: 76
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dr-jazz
  опции профиля:
сообщение 21.11.2011, 2:10
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 21.11.2011
Пользователь №: 3015

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




Репутация:   0  


Цитата(RazrFalcon @ 21.11.2011, 0:48) *
А зачем вы предопределяете QTabWidget?
Создайте проект в дизайнере Qt Creator'a. Там будет все проще.

Пример:


Спасибо за пример. Обязательно проверю.
Но все-же, возвращаясь к моему вопросу...
По логике все должно работать. У компилятора нет вопросов к коду, синтаксис слота тоже в порядке.
Где же у меня ошибка?

У меня сейчас нету цели писать какое-то конечное приложение. Просто хочу разобратбся как это работает (я о сигналах и слотах)

В общем, буду признателен, если подскажете.
В любом случае спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 21.11.2011, 3:37
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Проблема в том, что в Qt нельзя использовать два класса в 1-м хедере. Так как MOC это не поддерживает.

1) Можно создать отдельный хедр вида:
#include <QTabWidget>
#include <QLabel>

class myTabWidget : public QTabWidget
{
    Q_OBJECT

public slots:
    void plusTab() {
        this->addTab(new QLabel("new tab", this), "new tab");
    }
};
#endif
И его подключить к main.cpp. Тогда все работает.

2) Добавьте в конец main.cpp:
#include "main.moc"

но это будет работать только с отключенным shadow build (когда в соседнею папку компилируется)

Сообщение отредактировал RazrFalcon - 21.11.2011, 3:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 21.11.2011, 8:04
Сообщение #5


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

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

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




Репутация:   34  


Цитата
Проблема в том, что в Qt нельзя использовать два класса в 1-м хедере. Так как MOC это не поддерживает.


не согласен - вот сейчас вспомнил и нашёл у себя в проекте заголовочник, где рядом несколько классов определены с участием макроса Q_OBJECT , унаследованные от Qt классов. Работало без проблем

Раскрывающийся текст
//------------------------------------

class QForEdit_Button : public QPushButton
{
    Q_OBJECT
public:
...
public slots:
...
};

//------------------------------------

class QForEdit_LstViw: public QComboBox
{
    Q_OBJECT
...

public slots:
...
};
//------------------------------------

class QForEdit_Menu: public QMenu
{
    Q_OBJECT
public:
...
public slots:
...
};


Сообщение отредактировал Алексей1153 - 21.11.2011, 8:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 21.11.2011, 8:08
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

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




Репутация:   8  


class myTabWidget : public QTabWidget
{

public slots:
    void plusTab();
};


проблема в отсутствующем Q_OBJECT для myTabWidget

Сообщение отредактировал PAFOS - 21.11.2011, 8:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dr-jazz
  опции профиля:
сообщение 29.1.2012, 13:42
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 21.11.2011
Пользователь №: 3015

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




Репутация:   0  


Добрый всем день.

Большое спасибо за ответы и прошу прощения за долгую паузу.
Но вопрос все же не решен.

Я отделил определение и реализацию класса в отдельный файл tabs.h
Добил Q_OBJECT в класс и пробую запустить.

Как мне сообщает Qt - у меня
/home/aleksey/QT_projects/tabs-build-desktop/../tabs/tabs.h:16: multiple definition of `myTabWidget::plusTab()'

Где-то я туплю.... Помогите, пожалуйста.

Ниже листинги и сообщения об ошибках

tabs.h

#ifndef TABS_H
#define TABS_H
#include<QtGui>

class myTabWidget : public QTabWidget
{

    Q_OBJECT

public slots:
    virtual void plusTab();


void myTabWidget::plusTab()
{
    this->addTab(new QLabel("new tab", this), "new tab");
}

};

#endif // TABS_H



tabs.cpp

#include "tabs.h"

int main(int argc, char *argv[])
{

    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("Add/Remove Tabs");


    QVBoxLayout *layout = new QVBoxLayout;

    myTabWidget *tab = new myTabWidget;
    QPushButton *pb_add = new QPushButton;

    pb_add->setText("+");
//    tab->addTab(new QLabel("new tab", tab), "new tab");

    int num = 0;

    QObject::connect(pb_add, SIGNAL(clicked()), tab, SLOT(plusTab()));


    layout->addWidget(tab);
    layout->addWidget(pb_add);

    window->setLayout(layout);

    window->show();

    return app.exec();

}


"Консоль сборки"

Выполняется сборка проекта tabs...
Настройки не изменились, этап qmake пропускается.
Запускается «/usr/bin/make» -w
make: Вход в каталог `/home/aleksey/QT_projects/tabs-build-desktop'
g++ -c -m64 -pipe -g -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I../tabs -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I../tabs -I. -o tabs.o ../tabs/tabs.cpp
../tabs/tabs.cpp: В функции «int main(int, char**)»:
../tabs/tabs.cpp:20:9: предупреждение: неиспользуемая переменная «num» [-Wunused-variable]
/usr/bin/moc-qt4 -DQT_WEBKIT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I../tabs -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I../tabs -I. ../tabs/tabs.h -o moc_tabs.cpp
g++ -c -m64 -pipe -g -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I../tabs -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I../tabs -I. -o moc_tabs.o moc_tabs.cpp
g++ -m64 -o tabs tabs.o moc_tabs.o -L/usr/lib/x86_64-linux-gnu -lQtGui -lQtCore -lpthread
moc_tabs.o: In function `myTabWidget::plusTab()':
/home/aleksey/QT_projects/tabs-build-desktop/../tabs/tabs.h:16: multiple definition of `myTabWidget::plusTab()'
tabs.o:/home/aleksey/QT_projects/tabs-build-desktop/../tabs/tabs.h:16: first defined here
collect2: выполнение ld завершилось с кодом возврата 1

make: Выход из каталога `/home/aleksey/QT_projects/tabs-build-desktop'
make: *** [tabs] Ошибка 1
Процесс «/usr/bin/make» завершился с кодом 2.
Возникла ошибка при сборке проекта tabs (цель: Desktop)
Во время выполнения сборки на этапе «Сборка»


Спасибо за внимание :)

В предыдущем посте я не тот tabs.h привел.

Вот текущий:

tabs.h

#ifndef TABS_H
#define TABS_H
#include<QtGui>

class myTabWidget : public QTabWidget
{

Q_OBJECT

public slots:
virtual void plusTab();

};

void myTabWidget::plusTab()
{
this->addTab(new QLabel("new tab", this), "new tab");
}


#endif // TABS_H


P.S. не нашел, где сообщение можно редактировать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ernie
  опции профиля:
сообщение 29.1.2012, 14:16
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 13.5.2010
Из: Irkutsk
Пользователь №: 1712

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




Репутация:   1  


вы зря наверное в .h файле таким образом реализуете функцию.
Вот так вроде должно работать.

class myTabWidget : public QTabWidget
{

Q_OBJECT

public slots:
void plusTab(){
this->addTab(new QLabel("new tab", this), "new tab");

};

};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dr-jazz
  опции профиля:
сообщение 29.1.2012, 14:52
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 21.11.2011
Пользователь №: 3015

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




Репутация:   0  


Работает!
Огромное спасибо.

А можете прокомментировать?
Что не так было?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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