Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2020, 13:48   #11
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
какое значение у graphicdisplay - валидное?
widgetpencil - тоже ?
Если Вы про инициализированные значения, то я отвечу да.
Очень важный момент: ошибка вызывается, если переключиться с widgetpencil на widgetbrush, а потом опять на widgetpencil, т.е. повторно присвоивать graphicdisplay значение, которое когда то было присвоено.
Мaкс вне форума Ответить с цитированием
Старый 05.03.2020, 14:28   #12
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

Цитата:
void QMainWindow::setCentralWidget(QWidg et *widget)
Sets the given widget to be the main window's central widget.
Note: QMainWindow takes ownership of the widget pointer and deletes it at the appropriate time.
видимо, происходит следующее: скажем, устанавливаешь widgetpencil (родителем для него становится QMainWindow) . Затем устанавливаешь widgetbrush (всё повторяется, но при этом QMainWindow грохает старый виджет. Указатель widgetpencil становится невалидным)

Как попробовать вылечить. Перед заменой виджета доставать его методом centralWidget() (или сразу по указателю widgetpencil, если уверен, что ТАМ точно ОН) и принудительно ставить ему нового родителя (nullptr либо - какой согласно логике нужен). Только потом заменять

другой вариант - создавать нужный виджет перед установкой setCentralWidget динамически и забывать про него
Алексей1153 вне форума Ответить с цитированием
Старый 05.03.2020, 15:04   #13
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 54
По умолчанию

Мне кажется, лучше первый вариант.
Если второй, то с поправками - сделать конструктор копирования и перетащить centralWidget перед setCentralWidget, ну и указателю старому потом "тыц" на вновь созданную копию

Последний раз редактировалось Subst; 05.03.2020 в 15:25.
Subst вне форума Ответить с цитированием
Старый 05.03.2020, 19:17   #14
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
видимо, происходит следующее: скажем, устанавливаешь widgetpencil (родителем для него становится QMainWindow) . Затем устанавливаешь widgetbrush (всё повторяется, но при этом QMainWindow грохает старый виджет. Указатель widgetpencil становится невалидным)
Да! Именна эта причина! Остался только один маленький вопрос: как скопировать в не "указательный" объект класса объект - указатель? Даже если вот так написать:
Код:
ToolPencil buf(*graphicDisplay->widgetPencil);
Выдаёт ошибку. Что можете предложить?
P.S. Вы уже мне очень помогли
Мaкс вне форума Ответить с цитированием
Старый 05.03.2020, 19:48   #15
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
как скопировать в не "указательный" объект класса объект - указатель
не очень понимаю вопрос. Для чего ? Чем не устраивает просто указатель?

в этом случае класс ToolPencil должен являться вроппером, то есть иметь в себе поле для хранения указателя

Возможно, пытаешься изобрести std::shared_prt или QSharedPointer . Так они уже изобретены - бери да пользуйся ))
Алексей1153 вне форума Ответить с цитированием
Старый 06.03.2020, 12:33   #16
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Для чего ?
Сейчас расскажу. Есть указатель - graphicDisplay->widgetPencil. Нужно его скопировать, но при этом в другую область памяти, затем изменить центральный виджет из graphicDisplay->widgetPencil к примеру в graphicDisplay->widgetBrush и установить в удалённый graphicDisplay->widgetPencil буфферный объект, что бы сохранить. При вот таком коде:
Код:
ToolPencil *buf = graphicDisplay->widgetPencil;
setCentralWidget(graphicDisplay->widgetBrush);
graphicDisplay->widgetPencil = buf;
вылетает программа. Если просто выделить снова память, а не вернуть, то не сохранятся данные.
Код:
graphicDisplay->widgetPencil = new ToolPencil(graphicDisplay->display, graphicDisplay->selectedColor1, graphicDisplay->selectedColor2, graphicDisplay->uptool, &graphicDisplay->penWidth);
setCentralWidget(graphicDisplay->widgetBrush);
Алексей, как эту проблему решить?
Мaкс вне форума Ответить с цитированием
Старый 06.03.2020, 13:19   #17
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
Сейчас расскажу. Есть указатель - graphicDisplay->widgetPencil. Нужно его скопировать, но при этом в другую область памяти, затем изменить центральный виджет из graphicDisplay->widgetPencil к примеру в graphicDisplay->widgetBrush и установить в удалённый graphicDisplay->widgetPencil буфферный объект, что бы сохранить. При вот таком коде:
Код:
ToolPencil *buf = graphicDisplay->widgetPencil;
setCentralWidget(graphicDisplay->widgetBrush);
graphicDisplay->widgetPencil = buf;
вылетает программа. Если просто выделить снова память, а не вернуть, то не сохранятся данные.
Код:
graphicDisplay->widgetPencil = new ToolPencil(graphicDisplay->display, graphicDisplay->selectedColor1, graphicDisplay->selectedColor2, graphicDisplay->uptool, &graphicDisplay->penWidth);
setCentralWidget(graphicDisplay->widgetBrush);
Алексей, как эту проблему решить?
Прошу прощение за вмешательство, но я же писал как решить.
>> сделать конструктор копирования
для ToolPencil. У тебя все для этого есть

ToolPencil(const ToolPencil &other) {
здесь инициализируешь свои приватные свойства
и что-то еще, что нужно
в соответсnвии со свойствами и чем-то еще объекта other
}
Subst вне форума Ответить с цитированием
Старый 06.03.2020, 13:21   #18
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Subst Посмотреть сообщение
Прошу прощение за вмешательство,
Да это же лучше.
Цитата:
Сообщение от Subst Посмотреть сообщение
>> сделать конструктор копирования
для ToolPencil. У тебя все для этого есть

ToolPencil(const ToolPencil &other) {
здесь инициализируешь свои приватные свойства
и что-то еще, что нужно
в соответсnвии со свойствами и чем-то еще объекта other
}
Значит без реализации конструктора копирования не обойтись... Хорошо. Сделаем. Спасибо за подсказку Извините, не обратил внимание раньше
Мaкс вне форума Ответить с цитированием
Старый 06.03.2020, 13:28   #19
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 54
По умолчанию

Так ты по сути постоянно его используешь
что ты делаешь, например в такой ситуации..

int a=5
int b=a;
a=7;
a=8;
a=b;

чему a в результате будет равно?

идем в ООП и Qt

QString a("klop") - конструктор инициализации от *char
QString b(a); - конструктор копирования
a="subst"; - перегруженный operator =
a=b; - непосредственно operator =
Subst вне форума Ответить с цитированием
Старый 06.03.2020, 13:32   #20
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Subst Посмотреть сообщение
Так ты по сути постоянно его используешь
что ты делаешь, например в такой ситуации..

int a=5
int b=a;
a=7;
a=8;
a=b;

чему a в результате будет равно?

идем в ООП и Qt

QString a("klop") - конструктор инициализации от *char
QString b(a); - конструктор копирования
a="subst"; - перегруженный operator =
a=b; - непосредственно operator =
Спасибо за уточнение.
Мaкс вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пустое окно Tofock Общие вопросы C/C++ 3 07.04.2018 21:59
В delphi7 возникает такая ошибка при запуске: Illusiony Общие вопросы Delphi 3 28.11.2015 17:31
Программа для отчетов по проделанной работе, с чего начать?? antoxamad Помощь студентам 0 03.04.2012 16:11
При запуске программы, выдает пустое окно. Hooligan Общие вопросы C/C++ 1 29.02.2012 19:20
При запуске Windows XP возникает проблема Jertyk Компьютерное железо 4 28.12.2009 17:38