Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Pancar
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 8
1

Как обратиться к кнопке

08.11.2016, 03:39. Просмотров 960. Ответов 12
Метки нет (Все метки)

Всем привет! Я, понятное дело, начинающий. Столкнулся с такой проблемой.
Создаю динамический массив из кнопок, а потом пытаюсь обратиться к какой-то кнопке из метода другого класса. Для этого создал сигнал и слот. Я вижу, что соединение происходит, данные приходят - я могу их "присвоить", например, лейблу на форме. А вот к нужной кнопке обратиться не могу. Я так понимаю, это из-за того, что массив кнопок создавался в другом методе и указатели на них умерли. Может надо вообще по другому делать...
Прошу помощи, т.к. знаний не хватает и гугл не помог или я не то спрашивал.

Вот упрощенный код:

MainWindow.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <QMainWindow>
#include <vector>
#include "cellbutton.h"
#include "game.h"
using std::vector;
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
private:
    Ui::MainWindow *ui;
    vector<vector<CellButton*> > cells;
    Game game;
 
    void CreateButtons();
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
public slots:
    void set(int y, int x);
};
MainWindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    connect(&game,SIGNAL(sendData(int, int)),this,SLOT(set(int,int)));
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::CreateButtons()
{
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
        {
            cells[i][j] = new CellButton("", this, {i , j});
            cells[i][j]->setVisible(true);
        }
}
 
void MainWindow::set(int y, int x)
{
    cells[y][x]->setText("ok");/// вот здесь косяк
}
game.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <QObject>
 
class Game : public QObject
{
    Q_OBJECT
 
public:
    explicit Game(QObject *parent = 0);
 
signals:
    void sendData(int y, int x);
 
public slots:
    void onButtonSend();
};
game.cpp
C++ (Qt)
1
2
3
4
5
6
#include "game.h"
 
void Game::onButtonSend()
{
    emit sendData(1, 1);
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2016, 03:39
Ответы с готовыми решениями:

Нужно из кода обратиться к кнопке созданной в дизайнере
С помощью дизайнера создал окно программы с виджетами. Теперь нужно, например, для кнопки выхода...

Как завершить цикл по кнопке
Здравствуйте.У меня есть бесконечный цикл while(1){...}.Как его можно завершить по нажатию кнопки...

Как обратиться к свойствам объектам
нужно сделать у кнопки на форме enabled в false , не могу найти как это сделать внутри программы ,...

А как обратиться к LeniEdit на ToolBar'e ?
Добавляю новый Action на ToolBar. Хочу по нажатию на кнопку получить значение RateLine-&gt;Text(). Это...

Как обратиться к классу из другого
Доброго времени суток. Проблема такая, мне нужно обратиться к слоту друг-го класса. Пробую так: ...

12
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
08.11.2016, 08:02 2
Слот set() вызывается? Что за CellButton?
0
Wyn
1057 / 639 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
08.11.2016, 10:40 3
Pancar, Не вижу, чтобы у вас в массивах выделялось место под элементы. Либо выделяйте место заблаговременно с помощью resize, либо используйте insert, push_back и другие подобные функции std::vector для автоматического добавления элемента.

P.S. Это Qt. А значит тут есть свои инструменты, которые в большинстве своём предпочтительнее использовать. Вместо std::vector лучше использовать QVector.
1
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
08.11.2016, 12:43 4
Wyn, не понятно, почему ошибку-то не выдаёт у него.
0
08.11.2016, 12:43
Wyn
1057 / 639 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
08.11.2016, 14:23 5
Цитата Сообщение от nmcf Посмотреть сообщение
Wyn, не понятно, почему ошибку-то не выдаёт у него.
А почему должно выдавать ошибку? operator[] у std::vector не проверяет выход за пределы массива. Если же он происходит, то результат является UB.
0
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
08.11.2016, 14:28 6
Ну вот у большинства этот UB даёт ошибку.
0
Wyn
1057 / 639 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
08.11.2016, 14:49 7
Цитата Сообщение от nmcf Посмотреть сообщение
Ну вот у большинства этот UB даёт ошибку.
o_O

Не по теме:

Что тут сказать? Undefined behaviour на то и undefined behaviour.

0
Pancar
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 8
12.11.2016, 04:03  [ТС] 8
Дико извиняюсь, не было доступа к инету.
Размер массива я определяю через ресайз - видимо случайно грохнул эту часть кода, когда делал упрощенный вариант для форума.
C++ (Qt)
1
2
3
4
    cells.clear();
    cells.resize(3);
    for(int i = 0; i < 3; ++i)
        cells[i].resize(3);
Повторюсь. Все нормально работает, когда я делаю что-то с кнопками в том же методе, где их и создаю. Слоты и сигналы тоже работают - данные приходят из другого класса, я могу их отобразить, например, на лейбле на форме, а вот отобразить их на кнопке не могу из-за того, как я думаю, указатели на кнопки умерли. А как обратиться к ним по-другому, я не знаю. Загвоздка именно в этом.
0
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
12.11.2016, 08:55 9
Если cells внутри класса объявлен, то с указателями всё в порядке.
0
Байт
Эксперт C
20753 / 13225 / 2789
Регистрация: 24.12.2010
Сообщений: 27,841
12.11.2016, 11:16 10
Pancar, у каждого слота есть метод sender() Он дает указатель на объект, от которого пришел сигнал.
Ты можешь при создании дать своим кнопкам имена (objectName) По этим именам определять, что за кнопка была нажата. В общем, метод sender() во многом может помочь

Добавлено через 6 минут
C++ (Qt)
1
2
3
4
5
6
void CCC::clickla()  // Это слот
{
   QObject *s = QObject::sender();
   QPushButton *b = qobject_cast<QPushButton *>(s);
   if (b) b->setText("Меня зовут" + s->objectName() + "Зачем ты нажал на меня?");
}
1
Pancar
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 8
12.11.2016, 15:13  [ТС] 11
Байт, sender я использую, когда необходимо понять, какая кнопка была нажата. Но задача стоит наоборот - выполнить какой расчет, получить данные, и на основе их изменить некие свойства на определенной кнопке. Т.е. фактически никакая кнопка не нажимается.

nmcf, cells первый раз объявляется в mainwindow.h - vector<vector<CellButton*> > cells
0
Байт
Эксперт C
20753 / 13225 / 2789
Регистрация: 24.12.2010
Сообщений: 27,841
12.11.2016, 16:30 12
Цитата Сообщение от Pancar Посмотреть сообщение
изменить некие свойства на определенной кнопке.
Ну дык найди эту кнопку через findChild<QPushButton *>(имечко) и делай с ей, что хошь...
1
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
12.11.2016, 16:33 13
Цитата Сообщение от Pancar Посмотреть сообщение
cells первый раз объявляется в mainwindow.h
А что, ещё и второй раз есть? С resize() всё должно работать. Актуальный вариант покажи.
0
12.11.2016, 16:33
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2016, 16:33

Как заменить текст на кнопке на картинку?
Есть небольшая програмка - игра 15, нужно собрать пазл. Так вот мне необходимо заменить цифры на...

Как к кнопке привязать запуск файла?
Здравствуйте. Хотелось бы знать, как привязать к кнопке исполнение файла .ехе?

Как обратиться к форме другого класса
Как обратиться к форме другого класса, а именно показать ее пр нажатии кнопки из другой формы....


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru