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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: сигналы/слоты  (Прочитано 2243 раз)
kom
Гость
« : Декабрь 08, 2009, 21:37 »

Есть функция, которая создаёт QDoubleSpinBox-ы на вкладке QTabWidget
Код:
void QTabWidgetTools::CreateTabGeometryWidgets(int widNum, QVBoxLayout* pageLayout)
{
QHBoxLayout *xLay, *yLay, *zLay, *fiLay, *teLay;
QHBoxLayout *layMisc;
QVBoxLayout **vLay;
QGLWidgetGeom* visLoc;
CreateWidgetsSize = widNum;
CreateWidgets = (QWidget**)malloc(sizeof(QWidget*) * widNum);//memory for widgets
vLay = (QVBoxLayout**)malloc(sizeof(QVBoxLayout*) * widNum);//memory for layouts
for (int i=0; i<widNum; i++)
{
CreateWidgets[i] = new QWidget;
creationTab.Parall.common.xLb = new QLabel("coord. X:");
creationTab.Parall.common.xSpin = new QDoubleSpinBox;
SetCoordSpinParam(creationTab.Parall.common.xSpin);
xLay = new QHBoxLayout;
xLay->setAlignment(Qt::AlignRight);
xLay->addWidget(creationTab.Parall.common.xLb);
xLay->addWidget(creationTab.Parall.common.xSpin);
/*
таким же образом создаются ещё 4 QDoubleSpinBox-a
*/
vLay[i] = new QVBoxLayout(CreateWidgets[i]);
vLay[i]->addLayout(xLay);
vLay[i]->addLayout(yLay);
vLay[i]->addLayout(zLay);
vLay[i]->addLayout(fiLay);
vLay[i]->addLayout(teLay);
//дальше происходит подключение слотов
if(!(vis.empty()))
{
for (GLvecIter element = vis.begin(); element < vis.end(); element++)
{
visLoc = (*element);
connect(creationTab.Parall.common.xSpin,
SIGNAL(valueChanged(double)),visLoc,SLOT(setX(double)));
connect(creationTab.Parall.common.ySpin,
SIGNAL(valueChanged(double)),visLoc,SLOT(setY(double)));
connect(creationTab.Parall.common.zSpin,
SIGNAL(valueChanged(double)),visLoc,SLOT(setZ(double)));
connect(creationTab.Parall.common.fiSpin,
SIGNAL(valueChanged(double)),visLoc,SLOT(setFi(double)));
connect(creationTab.Parall.common.teSpin,
SIGNAL(valueChanged(double)),visLoc,SLOT(setTe(double)));
}
}
}
if (widNum>=0) //
{
creationTab.Parall.lengthLb = new QLabel("Length:");
creationTab.Parall.Length = new QDoubleSpinBox;
SetCoordSpinParam(creationTab.Parall.Length);
layMisc = new QHBoxLayout;
layMisc->setAlignment(Qt::AlignRight);
layMisc->addWidget(creationTab.Parall.lengthLb);
layMisc->addWidget(creationTab.Parall.Length);
if(!(vis.empty()))
{
for (GLvecIter element = vis.begin(); element < vis.end(); element++)
{
visLoc = (*element);
connect(creationTab.Parall.Length,
SIGNAL(valueChanged(double)),visLoc,SLOT(setLength(double)));
}
}
vLay[0]->addLayout(layMisc);
/*
создаются ещё 2 QDoubleSpinBox-a "Width" и "Height"
*/
}
for (int i = 0; i<widNum; i++)//заполняется вкладка QTabWidget-a
{
CreateWidgets[i]->setLayout(vLay[i]);
pageLayout->addWidget(CreateWidgets[i]);
}
}
Если вектор vis не пустой, то к слотам виджетов в нём подключаются сигналы спинбоксов. В таком случае всё вроде бы хорошо работает. Но если сигналы подключаются позже(сразу после вызова функции создания спинбоксов), то виджеты вектора реагируют только на часть спинбоксов ("Length","Width","Height"):
Код:
void QTabWidgetTools::addBrowser(QGLWidgetGeom* browser)
{
if (browser == NULL) return;
vis.push_back(browser);
connect(creationTab.Parall.common.xSpin,
SIGNAL(valueChanged(double)),browser,SLOT(setX(double)));
connect(creationTab.Parall.common.ySpin,
SIGNAL(valueChanged(double)),browser,SLOT(setY(double)));
connect(creationTab.Parall.common.zSpin,
SIGNAL(valueChanged(double)),browser,SLOT(setZ(double)));
connect(creationTab.Parall.common.fiSpin,
SIGNAL(valueChanged(double)),browser,SLOT(setFi(double)));
connect(creationTab.Parall.common.teSpin,
SIGNAL(valueChanged(double)),browser,SLOT(setTe(double)));
connect(creationTab.Parall.Length,
SIGNAL(valueChanged(double)),browser,SLOT(setLength(double)));
connect(creationTab.Parall.Width,
SIGNAL(valueChanged(double)),browser,SLOT(setWidth(double)));
connect(creationTab.Parall.Height,
SIGNAL(valueChanged(double)),browser,SLOT(setHeight(double)));
}
Вот описание вектора vis:
Код:
typedef QList<QGLWidgetGeom*> GLvec;
typedef GLvec::iterator GLvecIter;

Кто-нибудь сталкивался с подобной проблемой? С чем это может быть связано?   Непонимающий
« Последнее редактирование: Декабрь 08, 2009, 21:42 от kom » Записан
Dendy
Гость
« Ответ #1 : Декабрь 09, 2009, 02:38 »

Проверьте, пишутся ли ошибки при соединения сигналов/слотов в поток вывода при старте программы.
Записан
kom
Гость
« Ответ #2 : Декабрь 09, 2009, 13:19 »

gdb партизански молчит при пошаговом исполнении  Рот на замке
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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