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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Передать значение переменной  (Прочитано 13230 раз)
Victor007
Гость
« : Июль 13, 2013, 21:41 »

Ситуация следующая: у меня есть две формы (Widget1 и Widget2), одна открывается из другой по нажатию кнопки. В первой форме также есть comboBox и мне надо передать во вторую значение индекса comboBox (comboBox->currentIndex) из первой. То есть, мне нужно делать какие-то операции со значением, получаемым в первой форме: int a=ui->comboBox->currentIndex(). Вот эту переменную "а" мне и надо использовать во второй форме. Я вот что придумал: можно задать в первом виджете signal sendIndex1(int a), сделать emit sendIndex1(int a) по нажатию кнопки и получить его одновременно с открытием второго виджета. Вопрос в том, что цеплять к этому сигналу? И вообще, в правильном ли я направлении пытаюсь двигаться? Заранее спасибо.
« Последнее редактирование: Июль 13, 2013, 21:44 от Victor007 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Июль 13, 2013, 21:52 »

Какие сигналы? Улыбающийся

Код
C++ (Qt)
void Widget1::clickButton()
{
   int idx=ui->comboBox->currentIndex();
   Widget2 w2( idx, this );
   w2.exec();
}
 
Записан
Victor007
Гость
« Ответ #2 : Июль 14, 2013, 00:30 »

Спасибо! Но widget1.cpp "не знает" до нажатия на кнопку, что ему передастся значение idx и при компилляции выдает ошибку "'idx':undeclared identifier". Кроме того, есть еще две ошибки:
'Widget2::Widget2': no overloaded function takes 2 arguments
'exec': is not a member of 'Widget2'

Widget2 у меня задается соответственно в main.cpp:
 Widget2 *w2 = new Widget2;
« Последнее редактирование: Июль 14, 2013, 00:35 от Victor007 » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Июль 14, 2013, 03:16 »

exec есть у QDialog и QMenu (кст, они оба наследуются от QWidget), а раз у вас не они, используйте show()

Понятия не имею как у вас выглядит структура программы, но раз вас нужно чтобы Widget2 принимал сигнал, создайте у него слот и подключите к нему сигнал Улыбающийся

Слоты создаются так:
Код:
class Widget2: public QWidget
{
Q_OBJECT

public slots:
    void takeIndex(int a)
    {
     // какие то шаманские действия
    }
};

Подключаем сигнал к слоту:
Код:
Widget2 *w2 = new Widget2();
connect(w1, SIGNAL(sendIndex1(int), w2, SLOT(takeIndex(int)));

Если подключение сигнала будет в коде класса Widget1, тогда так:
Код:
Widget2 *w2 = new Widget2();
connect(this, SIGNAL(sendIndex1(int), w2, SLOT(takeIndex(int)));

Ну вроде, все понятно объяснил  Веселый
« Последнее редактирование: Июль 14, 2013, 03:29 от gil9red » Записан

_Vitaliy_
Гость
« Ответ #4 : Июль 14, 2013, 09:48 »

Не на правах рекламы (не мое) http://easy-qt.blogspot.ru/2012/10/1.html
Записан
Victor007
Гость
« Ответ #5 : Июль 14, 2013, 15:14 »

gil9red, спасибо! Как-то так я изначально и думал делать. Но undeclared identifier остался. Ведь "шаманские действия" я делаю реально в widget2.cpp, а класс описан в widget2.h. Чтобы было понятнее я приведу код, он очень короткий:
widget2.h
Код:
#ifndef WIDGET2_H
#define WIDGET2_H

#include <QWidget>

namespace Ui {
class widget2;
}

class widget2 : public QWidget
{
    Q_OBJECT
    
public:
    explicit widget2(QWidget *parent = 0);
    ~widget2();
    
private:
    Ui::widget2 *ui;

public slots:
    void takeIndex(int a);
//    {
//     // какие то шаманские действия
//    }
};
#endif // WIDGET2_H

widget2.cpp
Код:
#include "widget1.h"
#include "widget2.h"
#include "ui_widget2.h"

widget2::widget2(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::widget2)
{
    ui->setupUi(this);
    ui->spinBox->setValue(a+1); //для простоты что-то совсем тривиальное
}

widget2::~widget2()
{
    delete ui;
}

main.cpp
Код:
#include "widget1.h"
#include "widget2.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget1 *w = new Widget1;
    widget2 *w2 = new widget2;

    QObject::connect(w, SIGNAL(openw2()),w2, SLOT(show())); //вторая форма открывается из первой
    QObject::connect(w, SIGNAL(sendspinIndex1(int)),w2, SLOT(takeIndex(int))); //заветное число a

    w->show();
    
    return a.exec();
}

То есть щелкаем spinBox на одной форме, а на другой отображается в аналогичном элементе число, большее на единицу (постарался максимально упростить, чтобы было понятнее).
« Последнее редактирование: Июль 14, 2013, 15:17 от Victor007 » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #6 : Июль 14, 2013, 16:39 »

Слот эта тот же метод (функция), потому нужно его тоже описывать.
В h файле, вы объявили, что будет у вас слот void takeIndex(int a), а в cpp опишите функцию.

widget2.h
Код:
#ifndef WIDGET2_H
#define WIDGET2_H

#include <QWidget>

namespace Ui {
class widget2;
}

class widget2 : public QWidget
{
    Q_OBJECT
    
public:
    explicit widget2(QWidget *parent = 0, int a);
    ~widget2();
    
private:
    Ui::widget2 *ui;

public slots:
    void takeIndex(int a);
};
#endif // WIDGET2_H


widget2.cpp
Код:
#include "widget1.h"
#include "widget2.h"
#include "ui_widget2.h"

widget2::widget2(QWidget *parent, int a) :
    QWidget(parent),
    ui(new Ui::widget2)
{
    ui->setupUi(this);
    ui->spinBox->setValue(a+1); //для простоты что-то совсем тривиальное
}

widget2::~widget2()
{
    delete ui;
}

void widget2::takeIndex(int a)
{
   // какие то действия...
    // например, пусть индекс отобразится в заголовке окна
   setWindowTitle(QString("Индекс: %1").arg(a));
}


main.cpp
Код:
#include "widget1.h"
#include "widget2.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget1 *w = new Widget1();

// пусть a будет равно 1
    int a = 1;
    widget2 *w2 = new Widget2(0, // то есть у w2 нет родителя
                                           a); // вставляем число

    QObject::connect(w, SIGNAL(openw2()),w2, SLOT(show()));
    QObject::connect(w, SIGNAL(sendspinIndex1(int)),w2, SLOT(takeIndex(int)));

    w->show();
    
    return a.exec();
}

Теперь при создании Widget2 он будет получать какое то число, а какое именно, мы должны сами указать.
Если это число берется из Widget1, то возвращайте его из Widget1 и вставляйте в Widget2
Как вставить число я показал.

И советую немного прочесть по классам с++ Улыбающийся
« Последнее редактирование: Июль 14, 2013, 16:42 от gil9red » Записан

Victor007
Гость
« Ответ #7 : Июль 14, 2013, 17:12 »

Ага, спасибо, так заработало. Да, все объяснение предельно понятно, в h описываем прототип функции в cpp саму функцию. Я, честно говоря, Си длительное время изучал, просто все уже подзабылось, да и особенности qt очень специфические: сигналы, слоты..  В любом случае, спасибо за помощь.
PS: Хотелось бы еще услышать от Old комментарии к его реализации. Я так понял, она должна быть проще.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

PS: Хотелось бы еще услышать от Old комментарии к его реализации. Я так понял, она должна быть проще.
Как я понял по первому посту, то нужно взять индекс активного элемента combobox и передать его во второй виджет, который создается в слоте первого виджета. Вот мой вариант - передать его через конструктор второго виджета в качестве параметра.
Записан
Victor007
Гость
« Ответ #9 : Июль 14, 2013, 21:55 »

Ну да, так выглядит намного проще. Только я написал, что при этом получаем ошибки. Видимо, надо что-то прописать в widget2.cpp?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



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

ты можешь свой полный код привести? а то по огрызкам непонятно где ошибка.
Записан

Изучением 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
Victor007
Гость
« Ответ #11 : Июль 14, 2013, 23:03 »

Да, конечно. Это программа соответственно с попыткой реализации по Old. Если удобнее выложить по-другому, скажите, сделаю, как надо.

Записан
Victor007
Гость
« Ответ #12 : Июль 14, 2013, 23:07 »

И main.cpp
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



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

еще один, не знающий что такое архив.

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

Изучением 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
Victor007
Гость
« Ответ #14 : Июль 14, 2013, 23:31 »

Дык архив не добавляется! Пишет, что очень большой, хотя куда уж меньше.. Ошибки все приводил во втором посте.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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