Russian Qt Forum
Ноябрь 26, 2024, 08:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигнал из слота  (Прочитано 5866 раз)
backdoor
Гость
« : Июнь 15, 2013, 15:21 »

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

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

Покажите, пожалуйста, как реализовать такой connect?
Записан
Figaro
Гость
« Ответ #1 : Июнь 15, 2013, 15:25 »

Код:
emit передаем_в_слот1_mainWindow(вектор*);
Записан
backdoor
Гость
« Ответ #2 : Июнь 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]
« Последнее редактирование: Июнь 15, 2013, 16:09 от backdoor » Записан
Figaro
Гость
« Ответ #3 : Июнь 15, 2013, 16:13 »

что возвращает connect? либо минимальный компилируемый проект...
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Июнь 15, 2013, 16:28 »

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

Юра.
VPS
Гость
« Ответ #5 : Июнь 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();
}

Ваша переменная, которую Вы объявили в заголовочном файле не используется, т.к. внутри слота Вы создаёте другую переменную. Но вроде от этого программа не должна падать, а вот слот работать не будет...
« Последнее редактирование: Июнь 15, 2013, 16:50 от vps » Записан
backdoor
Гость
« Ответ #6 : Июнь 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. пока у меня вообще с ООП туговато и с коннектами никак не разобраться(. в дальнейшем попробую ваш способ.
« Последнее редактирование: Июнь 15, 2013, 17:59 от backdoor » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Июнь 15, 2013, 17:15 »

чем вообще отличается class *var от class *var=new class;
первое просто объявляет указатель (в нем будет содержаться мусор, и при попытке что-нибудь сделать с указателем программа, вероятно, крашнется), второе — выделяет память, так что указатель указывает на реальный объект. это базовые знания языка, которые нужно усвоить, а не лезть сразу окошки рисовать.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Figaro
Гость
« Ответ #8 : Июнь 15, 2013, 17:21 »

Для connect надо указывать существующий объект, а не хрен знает что....
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Июнь 15, 2013, 17:47 »

>>второе — выделяет память
точнее: как и первое, только ещё и выделяет память, создаёт в ней объект и присваивает его адрес указателю
второе по другому записывается так:
type *var; // как и в первом случае объявляет указатель
var = new class; // создаёт динамически объект в памяти и присваивает его адрес указателю
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Июнь 15, 2013, 17:51 »

>>но тут уже начал делать окно не от QDialog, а просто от QWidget

читайте это учебное пособие от авторов библиотеки (переведены на русский)
А лучше начать с самого первого http://www.doc.crossplatform.ru/qt/4.6.x/widgets-tutorial.html
« Последнее редактирование: Июнь 15, 2013, 17:54 от lit-uriy » Записан

Юра.
backdoor
Гость
« Ответ #11 : Июнь 15, 2013, 18:00 »

чем вообще отличается class *var от class *var=new class;
это базовые знания языка, которые нужно усвоить, а не лезть сразу окошки рисовать.
[/quote]
к сожалению зада поставлена независимо от возможностей реализации.

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

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Июнь 15, 2013, 18:13 »

..это базовые знания языка, которые нужно усвоить, а не лезть сразу окошки рисовать.
То да, но что бы вы/мы ни говорили - лезть будут Улыбающийся Там учить надо, чего-то вникать, а тут неск минут - и вот уже окно! Человека привлекает эффект достигнутого, впечатление быстрого прогресса. Невозможно убедить его в том что это "построено на песке" - ведь он только что "сделал", и результат налицо. Поэтому мне кажется нет никакого смысла тратить время на нотации. С новичками надо общаться поменьше, тем более им и так все ясно

все, разобрался,
ну вот и чудненько
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Июнь 15, 2013, 23:59 »

всегда есть надежда, что новичок примет подобные слова всерьез (ну или вспомнит когда-нибудь в будущем, что дельный совет-то уже давали), а чиркнуть строчкe-другую не так уж и сложно.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.11 секунд. Запросов: 23.