Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
SkyEX
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
#1

Обращение к определенному из нескольких однотипных виджетов

20.10.2015, 16:13. Просмотров 485. Ответов 17
Метки нет (Все метки)

Приветствую!

Есть двумерный массив с численными данными. Данные каждой строки массива соответствуют определенному параметру.
Пользователь выбирает необходимые ему параметры, нажимает на кнопку и строится график зависимости между этими параметрами. Для этого создается new QGLWidget, ему подсовываются данные, он их отрисовывает и затем выводится на экран с помощью show(). После создания окна в QListWidget добавляется новый итем.
Соответственно, если пользователь выберет другие параметры и нажмет на кнопку еще раз, то появится еще одно окно QGLWidget. В итоге получится два окна с разными графиками.

Вопрос:
Как, не создавая новое окно, изменить уже существующий график?



C++
1
2
3
4
5
6
7
8
9
    QGLWidget *graphWidget;
 
...
 
    graphWidget = new GraphWidget(this);
    ui->lwGraphList->addItem("New graph");
    emit signalSendData(dataX_item, dataY1_items, dataY2_items); //Отрисовка в другом классе GraphWidget
 
    graphWidget->show();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2015, 16:13
Ответы с готовыми решениями:

Создание нескольких однотипных QLabel
Здравствуйте. Создал 10 QLabel как показано ниже. Подскажите пожалуйста...

Отображение нескольких виджетов
У меня есть класс (MainWindow: public QWidget) в нем есть функция(обработки...

Отображение нескольких виджетов в QListView
Привет! Хочу отобразить список друзей вк. Должно быть что то типа такого: ...

Зависимый список из нескольких однотипных таблиц
Добрый вечер. Пытаюсь создать БД по наработке инструмента, но возникла одна...

Скрипт для нескольких однотипных элементов
Часть представления: @foreach (var item in Model.Targets) { ...

17
kolts
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
20.10.2015, 17:00 #2
Непонятно каким боком здесь lwGraphList.
Зачем graphWidget = new GraphWidget(this) делать это каждый раз при нажатии кнопки, если можно заранее создать переменную?
0
SkyEX
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
20.10.2015, 17:20  [ТС] #3
Непонятно каким боком здесь lwGraphList.
lwGraphList - это QListWidget. Туда добавляется новый итем, когда создается новое окно. Т.е. для изменения уже созданного графика выбирается соответствующий итем и нажимается кнопка "Изменить".
Мне нужно установить эту связь между итемами lwGraphList и созданными окнами.

Зачем graphWidget = new GraphWidget(this) делать это каждый раз при нажатии кнопки, если можно заранее создать переменную?
Если ее создать заранее и выводить при нажатии, то при повторном нажатии график перерисуется в том же окне. А эта кнопка должна создавать новое окно.
0
alexu_007
143 / 154 / 34
Регистрация: 29.05.2015
Сообщений: 1,113
20.10.2015, 17:29 #4
Цитата Сообщение от SkyEX Посмотреть сообщение
Вопрос:
Как, не создавая новое окно, изменить уже существующий график?

... то при повторном нажатии график перерисуется в том же окне. А эта кнопка должна создавать новое окно.
Вопрос интересный...
0
kolts
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
20.10.2015, 17:39 #5
Можно создать класс окна, допустим унаследованный от QDialog с названием Dialog. В нем должна быль паблик переменная QGLWidget *graphWidget;
Затем при нажатии на кнопку надо создать это окно и присвоить этой переменной уже существующий график.
C++ (Qt)
1
2
3
Dialog dialog;
dialog.graphWidget = graphWidget;//тот который создали заранее
dialog.exec();
0
SkyEX
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
20.10.2015, 17:47  [ТС] #6
alexu_007
Нет, вы не поняли.

Есть две кнопки "Добавить" и "Изменить". Выбираем данные -> жмем на кнопку "Добавить"-> получаем новое окно.
Таким образом насоздавали десять окон.
Хотим изменить данные девятого окна. Выбираем данные -> выбираем 9 итем в lwGraphList -> жмем на кнопку "Изменить"-> график в 9 окне перерисовывается.

Как обозначить, что первое созданное окно - это окно 1 и т.д? Я же не знаю сколько окон пользователь создаст.
0
kolts
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
20.10.2015, 17:59 #7
Только сейчас что то прояснилось. Тогда нужно создать контейнер с графиками
C++ (Qt)
1
QList<QGLWidget *> graphics;
Затем при нажатии на "добавить" добавляем в лист
C++ (Qt)
1
2
3
QGLWidget *graphWidget;
graphWidget = new GraphWidget(this);
graphics.append(graphWidget );
А при нажатии на изменить получаем график из контейнера
C++ (Qt)
1
graphics.value(rowNumber) //rowNumber - номер выделенной строки, не помню функцию
И уже меняем как хотим
1
SkyEX
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
20.10.2015, 20:36  [ТС] #8
kolts
Спасибо, попробую.
0
SkyEX
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
22.10.2015, 19:14  [ТС] #9
kolts
Попробовал.
При создании второго окна, первое тоже перестраивается и дублирует второе.
0
Горбаг
141 / 141 / 48
Регистрация: 25.09.2014
Сообщений: 749
Завершенные тесты: 2
23.10.2015, 08:15 #10
Дай, угадаю... У тебя в кнопке добавления весь этот код?

C++ (Qt)
1
2
3
QGLWidget *graphWidget;
graphWidget = new GraphWidget(this);
graphics.append(graphWidget );
0
SkyEX
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
23.10.2015, 08:53  [ТС] #11
Горбаг,
В заголовочнике формы где кнопки:
C++ (Qt)
1
2
3
4
5
6
class GraphForm : public QWidget
{
public:
     GraphWidget *graphWidget;
...
}
GraphWidget - это (class GraphWidget : public QGLWidget)

В кнопке добавления:
C++ (Qt)
1
2
3
4
5
6
graphWidget = new GraphWidget();
emit signalSendData(data1, data2, data3);
 
graphics.append(graphWidget);
graphics[wwe]->show();
wwe++;
wwe изначально равна 0;

Что-то не так?
0
Горбаг
141 / 141 / 48
Регистрация: 25.09.2014
Сообщений: 749
Завершенные тесты: 2
23.10.2015, 09:27 #12
Честно - не знаю. В моем понимании при добавлении должен нарисоваться новый график, что по-моему и должно происходить. Перерисовку 1 графика я тут не вижу.

А что произойдет при добавлении 3 графика? Изменятся оба предыдущих окна или только одно? Или иное?

И может лучше будет выложить весь код?
0
kolts
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
23.10.2015, 09:57 #13
Цитата Сообщение от SkyEX Посмотреть сообщение
emit signalSendData(data1, data2, data3);
А что в подключенном слоте?
0
SkyEX
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
23.10.2015, 10:00  [ТС] #14
Горбаг,
В моем понимании тоже.
Меняются все графики.
Вот весь код кнопки добавления, относящийся к этому:
C++ (Qt)
1
2
3
4
5
6
7
8
9
    graphWidget = new GraphWidget();
    connect(this, SIGNAL(signalSendData(QList< QVector <float> >, QVector <int>, QStringList)),
            graphWidget, SLOT(slotGetParametr(QList< QVector <float> >, QVector <int>, QStringList)));
 
    emit signalSendData(data1, data2, data3);
 
    graphics.append(graphWidget);
    graphics[wwe]->show();
    wwe++;
Сигнал signalSendData отправляет в класс GraphWidget три контейнера. Там они разбираются и по точкам рисуются линии с помощью OpenGL-функций. (initializeGL(), paintGL() ну и т.д.)
0
Горбаг
141 / 141 / 48
Регистрация: 25.09.2014
Сообщений: 749
Завершенные тесты: 2
23.10.2015, 10:19 #15
Может все-таки где-то затесался цикл? Или петля из сигналов-слотов? По-моему на это и похоже... Трудно гадать, не видя весь код проекта.

Добавлено через 8 минут
Да и в отладчике элементарно можно попробовать поставить точку останова, например, на
C++ (Qt)
1
 graphics[wwe]->show();
и внутри слота slotGetParametr

Просто ради интереса, сколько раз туда и туда попадаем, нажав Добавить новый график.
1
SkyEX
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
23.10.2015, 10:34  [ТС] #16
Горбаг,
Сделал как вы сказали.
Он заходит в slotGetParametr столько раз, какой по счету график был добавлен.
Вот, что вывелось (1 - это при нажатии кнопки, 2 - зашел в slotGetParametr)
Нажал первый раз:
1
2
Нажал второй раз:
1
2
2
Нажал третий раз:
1
2
2
2

Получается, что сигнал вызывается для всех созданных graphWidget. Почему так? Сигнал же вызывается 1 раз и только при нажатии кнопки.
0
Горбаг
141 / 141 / 48
Регистрация: 25.09.2014
Сообщений: 749
Завершенные тесты: 2
23.10.2015, 11:02 #17
Честно - с графиками не работал. Просто хотел помочь разобраться.

Очевидно что дело в коннекте сигнала:
C++ (Qt)
1
2
 connect(this, SIGNAL(signalSendData(QList< QVector <float> >, QVector <int>, QStringList)),
            graphWidget, SLOT(slotGetParametr(QList< QVector <float> >, QVector <int>, QStringList)));
Но как правильно его переписать не знаю. Может стоить почитать документацию еще немного?

Просто получается, что сигнал signalSendData уходит всем объектам класса graphWidget, а не конкретно созданному. Мне так кажется... Ведь объекты после создания через new вы не удаляете, но как обратиться к конкретному - не знаю, не сталкивался еще с таким.

Добавлено через 17 минут
Покажите еще слот slotGetParametr, как просили выше.
1
SkyEX
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
23.10.2015, 12:12  [ТС] #18
Сделал disconnect в конце и все заработало.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
    
    graphics<<(graphWidget = new GraphWidget());
    connect(this, SIGNAL(signalSendData(QList< QVector <float> >, QVector <int>, QStringList)),
            graphics[wwe], SLOT(slotGetParametr(QList< QVector <float> >, QVector <int>, QStringList)));
 
    emit signalSendData(data1, data2, data3);
 
    graphics[wwe]->show();
 
    disconnect(this, SIGNAL(signalSendData(QList< QVector <float> >, QVector <int>, QStringList)),
            graphics[wwe], SLOT(slotGetParametr(QList< QVector <float> >, QVector <int>, QStringList)));
    wwe++;
Спасибо, Горбаг, kolts.

Добавлено через 27 минут
А вообще, лучше сделать через конструктор класса, тогда не нужны коннекты.

C++ (Qt)
1
2
3
4
5
    graphics<<(graphWidget = new GraphWidget(data1, data2, data3));
 
    graphics[wwe]->show();
 
    wwe++;
0
23.10.2015, 12:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2015, 12:12

Обращение к определенному элементу списка.
Сабж. К примеру, имеется список: list &lt;int&gt; L; И есть цикл: list...

Обращение к определенному Item-y в ListView
Всем доброго времени суток. Итак, суть проблемы: есть ListView, который...

Один драйвер для нескольких однотипных устройств
Как реализовать в драйвере поддержку нескольких однотипных устройств? ...


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

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

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