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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2020, 13:34   #21
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 54
По умолчанию

если лень писать конструктор копирования, то "кто не моет посуду после еды, тот моет перед едой"

ToolPencil *pencil_2=new ToolPencil(graphicDisplay->widgetPencil->getDisplay(), graphicDisplay->widgetPencil->getSelectedColor1(), и т.д.)

getDisplay()
getSelectedColor1()
и пр.
нужно определить в классе для доступа к членам класса, если они не публичные конечно, чего не должно быть по хорошему
Subst вне форума Ответить с цитированием
Старый 06.03.2020, 15:24   #22
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

не понимаю, зачем тут какие-то конструкторы копирования лепить. Вот накидал пример, ничего не отваливается

mainwindow.h
Код:
#pragma once

#include <QMainWindow>
#include <QSharedPointer>
#include <QLineEdit>
#include <QSpinBox>
#include <QComboBox>

namespace Ui { class MainWindow; }

//один из виджетов
class CWid1:public QLineEdit
{
};

//один из виджетов
class CWid2:public QSpinBox
{
};

//один из виджетов
class CWid3:public QComboBox
{
};

class MainWindow : public QMainWindow
{
	Q_OBJECT
	Ui::MainWindow *ui=nullptr;

	//На всякий случай сюда запомним изначальный центральный виджет.
	//Его вернём в деструкторе
	QWidget* m_OldCentralWidget=nullptr;

	//три виджета будут переключаться по очереди
	CWid1 m_w1;
	CWid2 m_w2;
	CWid3 m_w3;

	//индекс предыдущего показанного виджета.
	//Нужен чисто для перебора в таймере
	size_t m_current_widget=0;

	//список перебираемых виджетов
	QVector<QWidget*> m_order{&m_w1,&m_w2,&m_w3};

public:
	MainWindow(QWidget *parent = nullptr);
	~MainWindow();
	void timerEvent(QTimerEvent* event)override;

};
mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
	: QMainWindow(parent)
	, ui(new Ui::MainWindow)
{
	ui->setupUi(this);

	m_OldCentralWidget=centralWidget();

	startTimer(1000);
}

MainWindow::~MainWindow()
{
	//возвращаем изначальный центральный виджет
	setCentralWidget(m_OldCentralWidget);

	delete ui;
}

void MainWindow::timerEvent(QTimerEvent* event)
{
	if(m_order.size())
	{
		//убираем родителя у текущего центрального виджета
		//- чтобы виджет не прибило в setCentralWidget
		if(auto* p=centralWidget())
		{
			p->setParent(nullptr);
		}

		//ставим новый центральный виджет
		m_current_widget=(m_current_widget+1)%m_order.size();
		setCentralWidget(m_order[m_current_widget]);
	}

	QMainWindow::timerEvent(event);
}
Алексей1153 вне форума Ответить с цитированием
Старый 06.03.2020, 15:32   #23
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 54
По умолчанию

Ну раз человеку не понравился первый предложенный метод.
По мне так проще, конечно, вывести в свободное плаванье центральный виджет.
Subst вне форума Ответить с цитированием
Старый 06.03.2020, 15:43   #24
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

Цитата:
Сообщение от Subst Посмотреть сообщение
Ну раз человеку не понравился первый предложенный метод.
у меня ощущение, что он просто невнимательно прочитал. Как может не понравиться простое заместо сложного ? ))
Алексей1153 вне форума Ответить с цитированием
Старый 06.03.2020, 17:02   #25
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 54
По умолчанию

Ну раз человеку не понравился первый предложенный метод.
По мне так проще, но вот Максу захотелось иначе...


Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
у меня ощущение, что он просто невнимательно прочитал. Как может не понравиться простое заместо сложного ? ))
Ну я не видел всего кода, может какие-то камни есть
Subst вне форума Ответить с цитированием
Старый 06.03.2020, 17:15   #26
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Subst Посмотреть сообщение
Ну раз человеку не понравился первый предложенный метод.
Я его не очень понял.
Мaкс вне форума Ответить с цитированием
Старый 06.03.2020, 17:50   #27
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Блин, проблема никак не исчезает... сомниваюсь, что кто то будет смотреть мой код, но... надеюсь...
Graphic-Editor-v-0-3.rar
Мaкс вне форума Ответить с цитированием
Старый 06.03.2020, 19:07   #28
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

Мaкс,

1)
падает тут ToolErasser::isSelect , потому что uptool==0xbaadf00d .
А он заполнен мусором из-за того, что тут ToolCore::ToolCore - у тебя не производится.
присваивание this->uptool = uptool; (строка закомметирована) и указатель остаётся не инициализирован.
Что, в свою очередь, проистекает из-за пренебрежения к инициализации

Цитата:
class ToolCore : public QWidget
{
public:
...
QToolBar *uptool=0;
обращение по нулевому указателю отловить проще. А ещё лучше - не допускать

2)
перед каждым вызовом setCentralWidget я вставил строку
Код:
if(auto* p=centralWidget()){p->setParent(nullptr);}
для решения вышеописанной проблемы с родительским виджетом

и всё, ничего не падает.

Но ещё нужно как в моём примере - на всякий пожарный - сохранить исходный центральный виджет и в деструкторе восстановить.
Алексей1153 вне форума Ответить с цитированием
Старый 06.03.2020, 19:09   #29
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

а я бы вообще QTabWidget заюзал вместо всех этих движений с центральным виджетом. На QTabWidget прямо в редакторе форм всё можно закинуть и не мучаться. Если нужна нестандартная переключалка - скрываем корешок таба и переключаем переключалкой
Алексей1153 вне форума Ответить с цитированием
Старый 07.03.2020, 10:29   #30
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
(строка закомметирована)
Ну я балбес.
Раскоментировал
Код:
if(auto* p=centralWidget()){p->setParent(nullptr);}
Добавил.
---
И всё заработало! Спасибо большушее!
М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