С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 16.03.2023
Сообщений: 39
1

Передача вектора объектов в "методы кнопок"

18.12.2023, 14:02. Показов 718. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Среда Qt_creator.

Я создал свой класс (предположим простейший, без реализации, пусть называется MyClass).
Я создал 3 объекта данного класса и передал в них один параметр.
Создал вектор и методом push_back добавил в него эти три объекта.
C++ (Qt)
1
2
3
4
5
6
7
 MyClass mc1(1);
 MyClass mc2(2);
 MyClass mc3(3);
    vector<MyClass> class;
    class.push_back(mc1);
    class.push_back(mc2);
    class.push_back(mc3);
Создал на форме пару кнопок, нажал "перейти к слотам" и в файле mainwindow.cpp образовались соответствующие методы реализации данных кнопок.

C++ (Qt)
1
2
3
void MainWindow::on_pushButton_clicked()
{
}
Теперь я хочу по нажатию кнопки работать с моим вектором, как это реализовать?
Где именно я должен создать объекты и сам вектор ? в main.cpp ?
каким образом передать его в данный метод (и нужно ли это или тут это реализуется не через передачу)?

Предположим что и в других методах кнопок я тоже захочу с ним работать...
сам класс я создал в отдельном файле class.h

p.s. Предположим , что по нажатию кнопки я просто хочу вывести на консоль параметр одного из объектов :
C++ (Qt)
1
qDebug << class[1].getParam;
а во второй кнопке , ну скажем параметр 3 объекта...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2023, 14:02
Ответы с готовыми решениями:

Передача объектов в методы.
Столкнулся с небольшой проблемой несоответствия типов: Для нахождения объекта пересечения двух...

Передача объектов в функции и методы
Как лучше передавать объекты в функции и методы и почему?

Передача объектов в методы по указателю
Здравствуйте. Тема звучит достаточно просто, но на самом деле я сформулировал её наверно...

Какие основные методы перехода от перестановки из n-1 объектов к перестановкам из n объектов?
Какие есть основные методы перехода от перестановки из n-1 объектов к перестановкам из n объектов?

15
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.12.2023, 14:27 2
Цитата Сообщение от GribnikAS Посмотреть сообщение
Где именно я должен создать объекты и сам вектор ?
В классе окна проще всего.
0
489 / 382 / 74
Регистрация: 29.05.2018
Сообщений: 1,178
18.12.2023, 14:34 3
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    vector<MyClass> class;
};
1
1 / 1 / 0
Регистрация: 16.03.2023
Сообщений: 39
18.12.2023, 14:50  [ТС] 4
Цитата Сообщение от Ender Che Посмотреть сообщение
C++ (Qt)
1
2
3
4
5
6
7
8
9
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    vector<MyClass> class;
};

это создание вектора... З это спасибо, да там он не вызывает ошибок, но у меня был еще вопрос про объекты и про добавление их в вектор.
Проделать это все внутри класса mainwindow я не смогу, в каком месте это следует сделать?
0
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
18.12.2023, 14:55 5
Цитата Сообщение от GribnikAS Посмотреть сообщение
vector<MyClass> class;
class-зарезервировано

параметры в слот можно захватывать, если юзать лямбду в качестве слота
C++ (Qt)
1
2
3
4
5
QList<MyClass> myClassList;
...
connect(btn, &QPushButton::clicked, [myClassList]{
    //делаешь что-то с myClassList;
});
1
489 / 382 / 74
Регистрация: 29.05.2018
Сообщений: 1,178
18.12.2023, 15:03 6
Цитата Сообщение от GribnikAS Посмотреть сообщение
у меня был еще вопрос про объекты и про добавление их в вектор.
Проделать это все внутри класса mainwindow я не смогу, в каком месте это следует сделать?
C++ (Qt)
1
2
3
4
5
6
7
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    class.push_back(mc1);
    class.push_back(mc2);
    class.push_back(mc3);
}
1
1 / 1 / 0
Регистрация: 16.03.2023
Сообщений: 39
18.12.2023, 15:10  [ТС] 7
Цитата Сообщение от Ender Che Посмотреть сообщение
C++ (Qt)
1
2
3
4
5
6
7
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    class.push_back(mc1);
    class.push_back(mc2);
    class.push_back(mc3);
}

Все понял, в конструкторе прописываем! спасибо большое) если я там же в конструкторе и сами объекты создам , это же не вызовет проблем? (ну в целом я уже создал и вижу, что все работает, но вдруг я чего то не учел).

Добавлено через 2 минуты
Цитата Сообщение от sdf45 Посмотреть сообщение
C++ (Qt)
1
2
3
4
5
QList<MyClass> myClassList;
...
connect(btn, &QPushButton::clicked, [myClassList]{
    //делаешь что-то с myClassList;
});
увы я еще не углубился в слоты и способен воспринять, только ответы формата "для начинающих" , типо как пишет Ender Che. Вам тоже спасибо за участие в решении проблемы.
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.12.2023, 15:12 8
Цитата Сообщение от GribnikAS Посмотреть сообщение
если я там же в конструкторе и сами объекты создам , это же не вызовет проблем?
Откуда вообще такие вопросы? Зачем их создавать где-то в другом месте?
0
489 / 382 / 74
Регистрация: 29.05.2018
Сообщений: 1,178
18.12.2023, 15:14 9
Лучший ответ Сообщение было отмечено GribnikAS как решение

Решение

Вот так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass
{};
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    vector<MyClass> class;
    MyClass m_myClass;
};
или вот так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "myclass.h"
#include <QMainWindow>
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    vector<MyClass> class;
    MyClass m_myClass;
};
вроде проблем быть не должно.
1
1 / 1 / 0
Регистрация: 16.03.2023
Сообщений: 39
18.12.2023, 15:22  [ТС] 10
Цитата Сообщение от Ender Che Посмотреть сообщение
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
#include "myclass.h"
#include <QMainWindow>
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    vector<MyClass> class;
    MyClass m_myClass;
};
работает , но есть нюанс , он не дает возможности создать объект с параметрами , ну т.е. MyClass m_myClass(1); (при условии, что есть конструктор с параметрами с такой перегрузкой) выдает ошибку... и получается, что при таком создании параметры объекта будет нужно устанавливать потом отдельно?

А вот если создавать его в конструкторе (там же, где добавляем их в вектор) , то там создается и с параметрами без проблем...
0
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
18.12.2023, 15:55 11
Цитата Сообщение от GribnikAS Посмотреть сообщение
в конструкторе и сами объекты создам , это же не вызовет проблем?
может вызвать, обьект будет уничтожен после того, как отработает конструктор

Добавлено через 1 минуту
зы не используйте ключевое слово class в названии переменных
2
489 / 382 / 74
Регистрация: 29.05.2018
Сообщений: 1,178
18.12.2023, 16:04 12
Цитата Сообщение от sdf45 Посмотреть сообщение
обьект будет уничтожен после того, как отработает конструктор
Согласен с уважаемым sdf45. Впрочем, если вектор с объектами в определении MainWindow, то можно попробовать так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "myclass.h"
#include <QMainWindow>
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    vector<MyClass*> class;
};
C++ (Qt)
1
2
3
4
5
6
7
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    class.push_back(new MyClass(1));
    class.push_back(new MyClass(2));
    class.push_back(new MyClass(3));
}
2
1 / 1 / 0
Регистрация: 16.03.2023
Сообщений: 39
18.12.2023, 16:39  [ТС] 13
Цитата Сообщение от sdf45 Посмотреть сообщение
может вызвать, обьект будет уничтожен после того, как отработает конструктор
я так понимаю, это произойдет в момент закрытия основной формы? ( если это так, то это приемлемо)
Цитата Сообщение от sdf45 Посмотреть сообщение
зы не используйте ключевое слово class в названии переменных
В своей программе я использую адекватные названия ( для того, что бы задавать вопросы , я создал отдельно мини програмку, что бы не разбираться в большом полотне и не погружать в него других...)

Цитата Сообщение от Ender Che Посмотреть сообщение
C++ (Qt)
1
2
3
4
5
6
7
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    class.push_back(new MyClass(1));
    class.push_back(new MyClass(2));
    class.push_back(new MyClass(3));
}

тут у меня возможно какой-то пробел в знаниях... а как будет при таком формате выставляться название объекта?

ну т.е. если я пишу :
C++ (Qt)
1
2
3
MyClass mc1(1);
 MyClass mc2(2);
 MyClass mc3(3);
а затем :
C++ (Qt)
1
2
3
class.push_back(mc1);
    class.push_back(mc2);
    class.push_back(mc3);
то я понимаю, что в векторе с названием class лежат три объекта с названиями mc1, mc2, mc3 .
я могу к ним обратиться скажем как class[0].getM(); ( ну к примеру...)
или mc1.getM(); (кстати я как то не задумывался, если объект лежит в векторе , я могу его использовать только в контексте вектора или же могу и отдельно ? ну т.е. будут ли эти два варианта равнозначны? )
А в вашем случае у объектов получается нету имен? и обратиться к ним можно только через вектор?
0
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
18.12.2023, 17:01 14
Ну, 11 пост-это больше про лямбды, когда захватывается обьект в ее область видимости.
Это я по инерции выдал, сорян.
Когда будете их юзать, разберетесь (захваты по значению, по ссылке...)
А так то вот
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
class W:public QWidget
{
    QList<int> lst1; //будет существовать, пока существует обьект этого класса
 
public:
    W(QWidget *parent=nullptr):QWidget(parent){
 
        QList<int> lst2;  //это будет существовать только внутри конструктора  
        int i; // и это  
    }
};
0
489 / 382 / 74
Регистрация: 29.05.2018
Сообщений: 1,178
18.12.2023, 19:37 15
Цитата Сообщение от GribnikAS Посмотреть сообщение
А в вашем случае у объектов получается нету имен? и обратиться к ним можно только через вектор?
Если вы записываете экземпляры объектов в вектор, то какая практическая польза от имён? Вы всегда можете обратиться к ним через вектор. Либо имена, либо вектор. К чему множить сущности?
Если очень хочется, то при использовании объекта извлекли его из вектора и скастовали в имя, чтобы привычнее было.

И, кстати, обратите внимание, что у меня в примере не объекты, а указатели на объекты.
1
1 / 1 / 0
Регистрация: 16.03.2023
Сообщений: 39
19.12.2023, 15:59  [ТС] 16
Цитата Сообщение от Ender Che Посмотреть сообщение
Если вы записываете экземпляры объектов в вектор, то какая практическая польза от имён? Вы всегда можете обратиться к ним через вектор. Либо имена, либо вектор. К чему множить сущности?
Если очень хочется, то при использовании объекта извлекли его из вектора и скастовали в имя, чтобы привычнее было.
И, кстати, обратите внимание, что у меня в примере не объекты, а указатели на объекты.
все логично) т.е. по сути запихивать в вектор имеет смысл только, если я и в дальнейшем планирую пользоваться через вектор. Спасибо!
0
19.12.2023, 15:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2023, 15:59
Помогаю со студенческими работами здесь

Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы
Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…)....

Создать класс Вектор на плоскости (поля-координаты начала и конца вектора).Реализовать для него методы:конструктор,вычисление координат самого вектора
Создать класс Вектор на плоскости (поля-координаты начала и конца вектора).Реализовать для него...

Объект - вектор: поля - координаты концов. методы: длина вектора, координаты вектора, скалярное произведение
объект-вектор.поля-координаты концов.методы-длина вектора,координаты вектора скалярное,произведение.

Передача объектов дочерних классов через массив объектов родительского класса в функцию
Здравствуйте. Возможно, вопрос больше относится к теории ООП, но все же я не решился задавать его в...

Создание динамического массива объектов и передача параметров объектов через метод конструктор
Здравствуйте, подскажите пожалуйста, как в Free Pascal создать динамический массив объектов и...

Базовый тип "обьект" содержит - поля:" вектор, его размер и идентификатор в символьном виде"- методы:" введение вектора, выведение вектора, определени
Базовый тип &quot;обьект&quot; содержит - поля:&quot; вектор, его размер и идентификатор в символьном виде&quot; -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru