Russian Qt Forum
Ноябрь 25, 2024, 18:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с QwtPlotZoomer (библиотека qwt) (или со мной уже)  (Прочитано 4816 раз)
star62
Гость
« : Август 16, 2009, 12:21 »

Дело вот в чем. Есть простейшее приложение
Код:
MainWindowImpl::MainWindowImpl( QWidget * parent, Qt::WFlags f) //конструктор
: QWidget(parent, f)
{
plot1 = new QwtPlot(this);
show();
zoomer = NULL;
if(zoomer){
std::cout<<"zoomer - YES"<<std::endl;
}else std::cout<<"zoomer - NO"<<std::endl;
gh(zoomer);
if(zoomer){
std::cout<<"zoomer - YES"<<std::endl;
}else std::cout<<"zoomer - NO"<<std::endl;
}

void MainWindowImpl::gh(QwtPlotZoomer *zoom){//единстенная функция MainWindowImpl находится в private
if(zoom) delete zoom;
zoom = new QwtPlotZoomer (QwtPlot::xBottom, QwtPlot::yLeft, plot1->canvas(), true);
zoom->setMousePattern(QwtEventPattern::MouseSelect1, Qt::LeftButton);
zoom->setMousePattern(QwtEventPattern::MouseSelect2, Qt::NoButton);
zoom->setMousePattern(QwtEventPattern::MouseSelect3, Qt::MidButton);
zoom->setMousePattern(QwtEventPattern::MouseSelect4, Qt::LeftButton);
zoom->setMousePattern(QwtEventPattern::MouseSelect5, Qt::NoButton);
zoom->setMousePattern(QwtEventPattern::MouseSelect6, Qt::NoButton);
zoom->setTrackerMode(QwtPicker::AlwaysOff);
}


Так вот проблема в том, что до gh(zoomer); и после zoomer равен NULL.

Насколько я понимаю, после gh(zoomer); он должен стать не NULL, но этого не происходит. Такое ощущение что я не указателем оперирую (хотя вроде бы  именно так), а просто переменной.
Объясните пожалуйста в чем проблема? Я чего-то не понимаю или баг какой?
Записан
BRE
Гость
« Ответ #1 : Август 16, 2009, 12:32 »

Если zoomer описан в классе, зачем передавать его в качестве параметра в qh?

Но если очень хочется, то нужно передавать в gh или указатель на указатель или ссылку на указатель.
Записан
star62
Гость
« Ответ #2 : Август 16, 2009, 13:09 »

Если zoomer описан в классе, зачем передавать его в качестве параметра в qh?

Но если очень хочется, то нужно передавать в gh или указатель на указатель или ссылку на указатель.
Да указатель сработал, спасибо.

Разьясните пожалуйста, почему так.
И еще как передать ссылку? В объявлении функции пишу void gh(QwtPlotZoomer &*zoom);, результат ошибка "src/mainwindowimpl.h:30: ошибка: недопустимая декларация указателя на ‘class QwtPlotZoomer&’".
Как это правильно сделать?
Записан
BRE
Гость
« Ответ #3 : Август 16, 2009, 13:24 »

Разьясните пожалуйста, почему так.
Параметр функции кладется на стек, при выполнении функции ты его меняешь, после выхода из функции параметр со стека снимается. Короче, ты меняешь локальные данные на стеке.

И еще как передать ссылку? В объявлении функции пишу void gh(QwtPlotZoomer &*zoom);, результат ошибка "src/mainwindowimpl.h:30: ошибка: недопустимая декларация указателя на ‘class QwtPlotZoomer&’".
Как это правильно сделать?
Ты описал указатель на ссылку (такое описание недопустимо), а надо наоборот.  Подмигивающий
Записан
star62
Гость
« Ответ #4 : Август 16, 2009, 13:39 »

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

То есть, по сути получилось так. Указатель это целое число, в фунцию было передано целое значение, которое является копией(другой ячейкой памяти) исходного. В результате работы функции в эту новую ячейку положили адрес созданного QwtPlotZoomer, но после завершения функции эта "копия" уничтожена, следовательно ячейка была очищена. Поэтому наруже я и не получал изменений указателя, потому что он вообще остался не при делах.

Я правильно понял?
Записан
BRE
Гость
« Ответ #5 : Август 16, 2009, 13:44 »

Я правильно понял?
Ага.  Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.134 секунд. Запросов: 21.