crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Создание элементов внутри условий
ernie
  опции профиля:
сообщение 3.10.2011, 3:38
Сообщение #11


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 13.5.2010
Из: Irkutsk
Пользователь №: 1712

Спасибо сказали: 11 раз(а)




Репутация:   1  


    int value=1,max=2,min=0;
    float step = 1;
    QAbstractSpinBox *spinBox;
    if (step > 1)
       spinBox= new QSpinBox();
    else
       spinBox = new QDoubleSpinBox();

    qobject_cast<QSpinBox*>(spinBox)->setValue(value);
    qobject_cast<QSpinBox*>(spinBox)->setMinimum(min);
    qobject_cast<QSpinBox*>(spinBox)->setMaximum(max);
    qobject_cast<QSpinBox*>(spinBox)->setSingleStep(step);


Как насчет такого варианта?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 9:07
Сообщение #12


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


ernie, это точно . А ещё лучше так

    int value=1;
    int max=2;
    int min=0;
    float step = 1;

    if (step > 1)
    {
        QSpinBox* spinBox= new QSpinBox();
        spinBox->setValue(value);
        spinBox->setMinimum(min);
        spinBox->setMaximum(max);
        spinBox->setSingleStep(step);
    }
    else
    {
        QDoubleSpinBox* spinBox = new QDoubleSpinBox();
        spinBox->setValue(value);
        spinBox->setMinimum(min);
        spinBox->setMaximum(max);
        spinBox->setSingleStep(step);
    }




или для любителей экономить пару строчек, так:

template<class SPIN>
void F1(int value,int max,int min,float step)
{
    SPIN* spinBox=new SPIN;
    spinBox->setValue(value);
    spinBox->setMinimum(min);
    spinBox->setMaximum(max);
    spinBox->setSingleStep(step);
}

void F2()
{
    int value=1;
    int max=2;
    int min=0;
    float step = 1;

    if (step > 1)
    {
        F1<QSpinBox>(value,max,min,step);
    }
    else
    {
        F1<QDoubleSpinBox>(value,max,min,step);
    }
}


можно даже вернуть из шаблона указатель на QWidget

Сообщение отредактировал Алексей1153 - 3.10.2011, 9:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.10.2011, 9:14
Сообщение #13


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


ernie, спасибо, интересный вариант.
Алексей1153, чем первый вариант отличается от моего? Второй даже длиннее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 9:21
Сообщение #14


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата
ernie, спасибо, интересный вариант.

я бы даже сказал - единственный вариант )) Так как в твоём варианте из первого сообщения объявлялись локальные указатели, к которым ты потом никак не доберёшься (ты не любишь ставить скобки блоков, иначе ты это увидел бы сразу) :

if (step > 1)
{
  QSpinBox *spinBox = new QSpinBox();
}
else
{
  QDoubleSpinBox *spinBox = new QDoubleSpinBox();
}

да и неужели не щёлкнуло, что одинаковые имена компилятор не даст определить ? :)

Цитата
чем первый вариант отличается от моего? Второй даже длиннее.

чем отличается - только что написал. Насчёт длиннее - визуально шаблон короче, но кода будет столько же, когда шаблон будет развёрнут.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.10.2011, 9:39
Сообщение #15


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата(Алексей1153 @ 3.10.2011, 9:21) *
ты не любишь ставить скобки блоков, иначе ты это увидел бы сразу

Нет, это я как раз увидел ;)

Цитата(Алексей1153 @ 3.10.2011, 9:21) *
да и неужели не щёлкнуло, что одинаковые имена компилятор не даст определить ? :)

По этому и хотел привести к какому то общему классу, что бы кода меньше было. Функции то у обеих одни и те же, практически.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 9:42
Сообщение #16


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


RazrFalcon, ну вот шаблон и примени

Цитата
template<class SPIN>
QWidget* F1(int value,int max,int min,float step)
{
SPIN* spinBox=new SPIN;
spinBox->setValue(value);
spinBox->setMinimum(min);
spinBox->setMaximum(max);
spinBox->setSingleStep(step);

return spinBox;
}


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.10.2011, 9:43
Сообщение #17


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Падает на этой строчке <_<

qobject_cast<QSpinBox*>(spinBox)->setValue(10);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 9:50
Сообщение #18


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


RazrFalcon, у меня нет такой строчки, откуда она ?

а, это ты вариант ernie пробуешь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Strikevld
  опции профиля:
сообщение 3.10.2011, 9:52
Сообщение #19


Студент
*

Группа: Участник
Сообщений: 53
Регистрация: 6.9.2011
Пользователь №: 2849

Спасибо сказали: 6 раз(а)




Репутация:   0  


Проще всего было бы поставить условие ниже!
Но можно и так:
QAbstractSpinBox * spinBox = NULL;
if (step > 1)
    ((QSpinBox*)spinBox) = new QSpinBox();
else
    ((QDoubleSpinBox*)spinBox) = new QDoubleSpinBox();

((QSpinBox*)spinBox)->setValue(value);
((QSpinBox*)spinBox)->setMinimum(min);
((QSpinBox*)spinBox)->setMaximum(max);
((QSpinBox*)spinBox)->setSingleStep(step);


Взависимости от того какой тип нужен приводи к нему соответственно!
QDoubleSpinBox и QSpinBox наследуются от QAbstractSpinBox!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.10.2011, 10:01
Сообщение #20


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Всем спасибо. Столько вариантов, и не один я не разу не видел и не применял - пошол читать книгу по с++ :lol:

Алексей1153, в шаблонах - ноль. Так что надо сначала понять как они работаю, а потом уже и в код добавлять...

Strikevld, ошибки на условии:
error: lvalue required as left operand of assignment
error: lvalue required as left operand of assignment


Сообщение отредактировал RazrFalcon - 3.10.2011, 10:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 17:45