сигналы и слоты в qt4 (сори за тупой вопрос)

Модератор: Модераторы разделов

Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

сигналы и слоты в qt4

Сообщение Lan4 »

Вобщем С++ я знаю, поэтому решил за полчаса разобратся в qt. Почти вышло, но есть один вопрос по "особой магии":
в дизайнере нарисовал формочку: менюшка (file->new, open и т.д.) и табВиджет. и соответственно главный файл:

Код: Выделить всё

#include <QApplication>
#include <QMainWindow>
#include "ui_main.h"

Ui::MainWindow UiMw;
QMainWindow* mw;

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

      mw = new QMainWindow();
      UiMw.setupUi(mw);
      setActions();
      mw -> show();

      return app.exec();
}

void setActions(){
    QObject::connect(UiMw.action_New, SIGNAL(triggered()), UiMw.tabWidget, SLOT(QTabWidget::addTab( new QWidget(), "untitled")));  //вот это не хочет работать
    QObject::connect(UiMw.action_Exit, SIGNAL(triggered()), mw, SLOT(close()));
}


при нажатии пункта меню new дожна добавлятся одна вклдка, но так не происходит. Причем, если в main просто написать строку:

Код: Выделить всё

UiMw.tabWidget->QTabWidget::addTab( new QWidget(), "untitled");

то вкладка добавляется.

Подскажите, почему в первом случае не работает так, как надо.
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: сигналы и слоты в qt4

Сообщение kamre »

Lan4 писал(а):
18.02.2010 21:38
соответственно главный файл:

Код: Выделить всё

...
  QObject::connect(UiMw.action_New, SIGNAL(triggered()), UiMw.tabWidget, SLOT(QTabWidget::addTab( new QWidget(), "untitled")));  //вот это не хочет работать
...


Подскажите, почему в первом случае не работает так, как надо.

Нет такого слота у QTabWidget: http://qt.nokia.com/doc/4.6/qtabwidget.html Этот вызов connect должен выдавать ошибку в stderr. Все что внутри макроса SLOT просто как строчка рассматривается, только в runtime эта строка разбирается и идет привязка слота к сигналу. Так что писать там все что хочешь нельзя.
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: сигналы и слоты в qt4

Сообщение Lan4 »

спасибо, просветили =)
тогда вопрос еще тупее: а как тогда можно реализовать поставленную задачу?
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: сигналы и слоты в qt4

Сообщение Lan4 »

кажется понял: можно создать какой-нить класс, а в него добавить слот, который будет выполнять нужное действие, т.е. в данном случае добавление новой вкладки.
Спасибо сказали:
MrSinister
Сообщения: 95

Re: сигналы и слоты в qt4

Сообщение MrSinister »

Lan4 писал(а):
18.02.2010 22:26
кажется понял: можно создать какой-нить класс, а в него добавить слот, который будет выполнять нужное действие, т.е. в данном случае добавление новой вкладки.


В принципе верно. Что-то типа этого:

Код: Выделить всё

class dummycl : public QObject
{
    Q_OBJECT
public:
    dummycl(QTabWidget* qtwp, QString title);
    ~dummycl();
private:
    QTabWidget* qtwPtr;
    QString title;
private slots:
    void vaddtab();
};
dummycl::dummycl(QTabWidget* qtwp, QString title) : qtwPtr(qtwp), title(title)
{
}
dummycl::~dummycl()
{
}
void dummycl::vaddtab()
{
    qtwPtr->addTab(new QWidget(), title);
}


там, где его будешь юзать, объявишь указатель на объект: dummycl *dc;
и потом

Код: Выделить всё

dc = new dummycl(ui->tabWidget, "Untitled");
QObject::connect(ui->actionNew, SIGNAL(triggered()), dc, SLOT(vaddtab()));


Конечно, в идеале лучше с редактором форм не связываться, и писать свой класс интерфейса. Меньше хлама и гибче, особенно со слотами. Ну а так, ничто не мешает добавить слоты в сгенерированный. Можно и вообще без слотов обойтись (но это не Qt-way).
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: сигналы и слоты в qt4

Сообщение Lan4 »

MrSinister писал(а):
18.02.2010 23:02
Конечно, в идеале лучше с редактором форм не связываться, и писать свой класс интерфейса. Меньше хлама и гибче, особенно со слотами. Ну а так, ничто не мешает добавить слоты в сгенерированный. Можно и вообще без слотов обойтись (но это не Qt-way).

Наверное потому, что раньше все рисовал через интерфейс (за исключением одного раза программирования на чистом винАПИ), мне кажется, что будут трудности с расположением контролов, хотя читал, что qt умеет их сам выравнивать в некоторой степени.
Спасибо сказали:
Аватара пользователя
Vital86
Сообщения: 79
ОС: Debian SID, Mandriva 2010

Re: сигналы и слоты в qt4

Сообщение Vital86 »

Lan4 писал(а):
19.02.2010 09:11
MrSinister писал(а):
18.02.2010 23:02
Конечно, в идеале лучше с редактором форм не связываться, и писать свой класс интерфейса. Меньше хлама и гибче, особенно со слотами. Ну а так, ничто не мешает добавить слоты в сгенерированный. Можно и вообще без слотов обойтись (но это не Qt-way).

Наверное потому, что раньше все рисовал через интерфейс (за исключением одного раза программирования на чистом винАПИ), мне кажется, что будут трудности с расположением контролов, хотя читал, что qt умеет их сам выравнивать в некоторой степени.

Посмотри в сторону QTCreator. Там связать сигнал и слот достаточно легко, а можно вообще без них.
Спасибо сказали:
Doublespace
Сообщения: 275
ОС: Debian Lenny,Squeeze,Centos

Re: сигналы и слоты в qt4

Сообщение Doublespace »

Для расположения контролов пользуйтесь QLayout , легче,чем вручную интерфейс рисовать.
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: сигналы и слоты в qt4

Сообщение Crazy »

Открой того же Макс Шлее и посмотри на QMenu, QAction и т.д.

Desipere in loco
Спасибо сказали:
Аватара пользователя
ra3ggy
Сообщения: 4
ОС: suse 10.3 x86

Re: сигналы и слоты в qt4

Сообщение ra3ggy »

Вот нашёл в архиве неплохую статейку по этой теме, сам по началу по ней отвыкал от С++ Builder
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: сигналы и слоты в qt4

Сообщение Lan4 »

ra3ggy писал(а):
21.02.2010 17:11
Вот нашёл в архиве неплохую статейку по этой теме, сам по началу по ней отвыкал от С++ Builder

спасибо, жалко, что к билдеру я даже не начинал привыкать :D
Спасибо сказали:
Leviafant
Сообщения: 47
ОС: Мандрива 2010

Re: сигналы и слоты в qt4

Сообщение Leviafant »

Код: Выделить всё

FormBar::FormBar(QWidget *parent)
        : QProgressBar(parent)
{

     setupUi(this);

     progressBar->setValue(testbar());

}

int FormBar::testbar()
{
    for(int i = 2; i <100; i++)
    {
        return i;
    }
}
QProgressBar должен вывести весь цикл функции, тоесть шкалу которая изменяется от 2 до 100, но выводит тока 2. Как сделать что бы цикл нормально работал? И как это сделать на сигнал/слот?
Вот исходник, это в файле bar.cpp
http://waper.ru/file/1255971/ui_bar.h.zip
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: сигналы и слоты в qt4

Сообщение Crazy »

Leviafant писал(а):
24.02.2010 00:35

Код: Выделить всё

FormBar::FormBar(QWidget *parent)
        : QProgressBar(parent)
{

     setupUi(this);

     progressBar->setValue(testbar());

}

int FormBar::testbar()
{
    for(int i = 2; i <100; i++)
    {
        return i;
    }
}
QProgressBar должен вывести весь цикл функции, тоесть шкалу которая изменяется от 2 до 100, но выводит тока 2. Как сделать что бы цикл нормально работал? И как это сделать на сигнал/слот?
Вот исходник, это в файле bar.cpp
http://waper.ru/file/1255971/ui_bar.h.zip

Вот тебе пример из книги Макса Шлее.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Desipere in loco
Спасибо сказали: