Russian Qt Forum

Qt => Вопросы новичков => Тема начата: backdoor от Июнь 15, 2013, 15:21



Название: Сигнал из слота
Отправлено: backdoor от Июнь 15, 2013, 15:21
Всем привет! Подскажите в очередной раз такую штуку. Надо из слота одного класса отправить сигнал в слот другого класса, например:
Код:
DialogWindow::button_pressed_slot()
{
  <что-то делаем>
   ...
   передаем_в_слот1_mainWindow(вектор*);
}

Код:
mainWindow::слот1(вектор *)
{
....
}

Покажите, пожалуйста, как реализовать такой connect?


Название: Re: Сигнал из слота
Отправлено: Figaro от Июнь 15, 2013, 15:25
Код:
emit передаем_в_слот1_mainWindow(вектор*);


Название: Re: Сигнал из слота
Отправлено: backdoor от Июнь 15, 2013, 16:07
сделал, но прога, не запустившись, завершается аварийно, прикладываю содержание файлов, сигнал sendDetals:

addwindow.h
Код:
namespace Ui {
class addWindow;
}

class addWindow : public QWidget
{
    Q_OBJECT

public:
    explicit addWindow(QWidget *parent = 0);
    ~addWindow();

public slots:
    void on_okButton_clicked();

[code]signals:
    void sendDetals(QVector<QString>* vec);

private:
    Ui::addWindow *ui;
};

addwindow.cpp
Код:
#include "addwindow.h"
#include "ui_addwindow.h"

addWindow::addWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::addWindow)
{
    ui->setupUi(this);
}

void addWindow::on_okButton_clicked()
{
   QVector<QString> *vect = new QVector<QString>;

    emit sendDetals(vect);
}

mainwindow.h
Код:
#include "addwindow.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void add_slot(QVector<QString> *vec);

public:
    Ui::MainWindow *ui;

private:
    addWindow *addw;
};

mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "addwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(addw,SIGNAL(sendDetals(QVector<QString>*)),this,SLOT(add_slot(QVector<QString>*)));
}

void MainWindow::on_addButton_clicked()
{
    addWindow *addw = new addWindow();
    addw->show();
}

void MainWindow::add_slot(QVector<QString> *vec)
{
    qDebug() << "ура!";
}
[/code]


Название: Re: Сигнал из слота
Отправлено: Figaro от Июнь 15, 2013, 16:13
что возвращает connect? либо минимальный компилируемый проект...


Название: Re: Сигнал из слота
Отправлено: lit-uriy от Июнь 15, 2013, 16:28
Если данные из диалога нужны по окончании работы с ним, то я бы это вообще иначе сделал:
1) в диалоге предусматриваю функцию (функции), которая вернёт нужные данные
2) в главном окне создаём объект диалога
3) в главном окне связываем штатный сигнал QDialog::accepted() со слотом главного окна (например, некий finishDialog)
4) в указанном слоте читаю данные из диалога с помощью функции п.1
обращаясь к диалогу по указателю, который получу так
Код:
addWindow *dialog = qobject_cast<addWindow *>(sender());
5) вызываю для диалога метод deleteLater(), чтобы диалог удалился (если главное окно его родитель), или удаляю непосредственно.


Название: Re: Сигнал из слота
Отправлено: VPS от Июнь 15, 2013, 16:36
Если я правильно понял, то у Вас ошибка вот в этом куске:
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(addw,SIGNAL(sendDetals(QVector<QString>*)),this,SLOT(add_slot(QVector<QString>*)));
}

void MainWindow::on_addButton_clicked()
{
    addWindow *addw= new addWindow();
    addw->show();
}

Ваша переменная, которую Вы объявили в заголовочном файле не используется, т.к. внутри слота Вы создаёте другую переменную. Но вроде от этого программа не должна падать, а вот слот работать не будет...


Название: Re: Сигнал из слота
Отправлено: backdoor от Июнь 15, 2013, 16:55
что возвращает connect? либо минимальный компилируемый проект...
приложил проект.

А именно, в конструкторе при вызове connect, у вас идёт обращение к переменной addw, которую этот метод не видит, т.к. она объявляется в слоте....
Сделайте переменную addw членом класса...
чем вообще отличается class *var от class *var=new class;

Если данные из диалога нужны по окончании работы с ним, то я бы это вообще иначе сделал:
1) в диалоге предусматриваю функцию (функции), которая вернёт нужные данные
2) в главном окне создаём объект диалога
3) в главном окне связываем штатный сигнал QDialog::accepted() со слотом главного окна (например, некий finishDialog)
4) в указанном слоте читаю данные из диалога с помощью функции п.1
обращаясь к диалогу по указателю, который получу так
Код:
addWindow *dialog = qobject_cast<addWindow *>(sender());
5) вызываю для диалога метод deleteLater(), чтобы диалог удалился (если главное окно его родитель), или удаляю непосредственно.
Спасибо, возьму на заметку, но тут уже начал делать окно не от QDialog, а просто от QWidget. пока у меня вообще с ООП туговато и с коннектами никак не разобраться(. в дальнейшем попробую ваш способ.


Название: Re: Сигнал из слота
Отправлено: kambala от Июнь 15, 2013, 17:15
чем вообще отличается class *var от class *var=new class;
первое просто объявляет указатель (в нем будет содержаться мусор, и при попытке что-нибудь сделать с указателем программа, вероятно, крашнется), второе — выделяет память, так что указатель указывает на реальный объект. это базовые знания языка, которые нужно усвоить, а не лезть сразу окошки рисовать.


Название: Re: Сигнал из слота
Отправлено: Figaro от Июнь 15, 2013, 17:21
Для connect надо указывать существующий объект, а не хрен знает что....


Название: Re: Сигнал из слота
Отправлено: lit-uriy от Июнь 15, 2013, 17:47
>>второе — выделяет память
точнее: как и первое, только ещё и выделяет память, создаёт в ней объект и присваивает его адрес указателю
второе по другому записывается так:
type *var; // как и в первом случае объявляет указатель
var = new class; // создаёт динамически объект в памяти и присваивает его адрес указателю


Название: Re: Сигнал из слота
Отправлено: lit-uriy от Июнь 15, 2013, 17:51
>>но тут уже начал делать окно не от QDialog, а просто от QWidget

читайте это учебное пособие (http://www.doc.crossplatform.ru/qt/4.6.x/tutorials-addressbook.html) от авторов библиотеки (переведены на русский)
А лучше начать с самого первого http://www.doc.crossplatform.ru/qt/4.6.x/widgets-tutorial.html


Название: Re: Сигнал из слота
Отправлено: backdoor от Июнь 15, 2013, 18:00
чем вообще отличается class *var от class *var=new class;
это базовые знания языка, которые нужно усвоить, а не лезть сразу окошки рисовать.
[/quote]
к сожалению зада поставлена независимо от возможностей реализации.

Для connect надо указывать существующий объект, а не хрен знает что....
золотые слова))
все, разобрался, всем спасибо, учебные пособия буду изучать.


Название: Re: Сигнал из слота
Отправлено: Igors от Июнь 15, 2013, 18:13
..это базовые знания языка, которые нужно усвоить, а не лезть сразу окошки рисовать.
То да, но что бы вы/мы ни говорили - лезть будут :) Там учить надо, чего-то вникать, а тут неск минут - и вот уже окно! Человека привлекает эффект достигнутого, впечатление быстрого прогресса. Невозможно убедить его в том что это "построено на песке" - ведь он только что "сделал", и результат налицо. Поэтому мне кажется нет никакого смысла тратить время на нотации. С новичками надо общаться поменьше, тем более им и так все ясно

все, разобрался,
ну вот и чудненько


Название: Re: Сигнал из слота
Отправлено: kambala от Июнь 15, 2013, 23:59
всегда есть надежда, что новичок примет подобные слова всерьез (ну или вспомнит когда-нибудь в будущем, что дельный совет-то уже давали), а чиркнуть строчкe-другую не так уж и сложно.