Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: star62 от Август 16, 2009, 12:21



Название: Проблема с QwtPlotZoomer (библиотека qwt) (или со мной уже)
Отправлено: 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, но этого не происходит. Такое ощущение что я не указателем оперирую (хотя вроде бы  именно так), а просто переменной.
Объясните пожалуйста в чем проблема? Я чего-то не понимаю или баг какой?


Название: Re: Проблема с QwtPlotZoomer (библиотека qwt) (или со мной уже)
Отправлено: BRE от Август 16, 2009, 12:32
Если zoomer описан в классе, зачем передавать его в качестве параметра в qh?

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


Название: Re: Проблема с QwtPlotZoomer (библиотека qwt) (или со мной уже)
Отправлено: star62 от Август 16, 2009, 13:09
Если zoomer описан в классе, зачем передавать его в качестве параметра в qh?

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

Разьясните пожалуйста, почему так.
И еще как передать ссылку? В объявлении функции пишу void gh(QwtPlotZoomer &*zoom);, результат ошибка "src/mainwindowimpl.h:30: ошибка: недопустимая декларация указателя на ‘class QwtPlotZoomer&’".
Как это правильно сделать?


Название: Re: Проблема с QwtPlotZoomer (библиотека qwt) (или со мной уже)
Отправлено: BRE от Август 16, 2009, 13:24
Разьясните пожалуйста, почему так.
Параметр функции кладется на стек, при выполнении функции ты его меняешь, после выхода из функции параметр со стека снимается. Короче, ты меняешь локальные данные на стеке.

И еще как передать ссылку? В объявлении функции пишу void gh(QwtPlotZoomer &*zoom);, результат ошибка "src/mainwindowimpl.h:30: ошибка: недопустимая декларация указателя на ‘class QwtPlotZoomer&’".
Как это правильно сделать?
Ты описал указатель на ссылку (такое описание недопустимо), а надо наоборот.  ;)


Название: Re: Проблема с QwtPlotZoomer (библиотека qwt) (или со мной уже)
Отправлено: star62 от Август 16, 2009, 13:39
Параметр функции кладется на стек, при выполнении функции ты его меняешь, после выхода из функции параметр со стека снимается. Короче, ты меняешь локальные данные на стеке.

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

Я правильно понял?


Название: Re: Проблема с QwtPlotZoomer (библиотека qwt) (или со мной уже)
Отправлено: BRE от Август 16, 2009, 13:44
Я правильно понял?
Ага.  ;)