Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ammaximus от Января 27, 2012, 08:31



Название: Движение виджетов
Отправлено: ammaximus от Января 27, 2012, 08:31
Я делаю таблицу, в которой по результатам сортировки должны меняться местами столбцы. Чтобы было более очевидно, что содержимое столбца изменилось, я хочу менять их с анимацией наплывом. Решил реализовывать столбцы с помощью QPixmap. Помогите поменять местами два столбца вот на таком простом примере:
Код:
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    a = new QPixmap(50,150);
    b = new QPixmap(50,150);
    a->fill(QColor(Qt::red));
    b->fill(QColor(Qt::green));
}

void Widget::paintEvent(QPaintEvent * e){
    QPainter *p = new QPainter(this);

    p->drawPixmap(0,0,*a);
    p->drawPixmap(50,0,*b);
}


Название: Re: Движение виджетов
Отправлено: interv от Января 27, 2012, 09:40
Чегото я не понимаю, Вы наследуетесь от QWidget для тогочтобы сделать свой класс "Таблица"?
если нет, то зачем void Widget::paintEvent(QPaintEvent * e), надо переопределять класс QTableWidget или QTableView.
а если да то флаг вам в руки, создавать свой TableWidget это все равно что создавать велосипед...


Название: Re: Движение виджетов
Отправлено: ammaximus от Января 27, 2012, 09:57
Боюсь что и при этом придется все полностью перерисовывать. Что то решение у меня как то смутно представляется


Название: Re: Движение виджетов
Отправлено: interv от Января 27, 2012, 10:10
отнють, есть разные варианты, например использование делигатов (QItemDelegate) для отрисовки...


Название: Re: Движение виджетов
Отправлено: ammaximus от Января 27, 2012, 11:33
оу, прошу прощения, Qt 3.3


Название: Re: Движение виджетов
Отправлено: ammaximus от Января 27, 2012, 11:50
Вообщем я буду наследовать у QTableItem и делать свое отображение, у меня все равно нестандартный вид быть должен. Таким образом вопрос сохраняется, как плавно поменять местами два виджета, чтобы получилась анимация, т.е. один выходит на какое то место, а остальные двигаются.


Название: Re: Движение виджетов
Отправлено: ammaximus от Января 27, 2012, 13:19
Как всегда, запутал народ деталями. Меня интересует как правильно сделать анимацию - перемещения группы виджетов по поверхности другого.


Название: Re: Движение виджетов
Отправлено: lighting от Января 27, 2012, 13:32
QPropertyAnimation но поскольку у тебя Qt 3.3 то видимо делать ее придется вручную. Думаю move() + QTimer для этого должно быть достаточно.


Название: Re: Движение виджетов
Отправлено: Bepec от Января 27, 2012, 17:26
Тебе придётся делать кучу жутких и совершенно "костыльных" действий.

Вариант с Move/QTimer не прокатит помоему, ибо компоновщики будут каждый раз перерасчитывать заново :)

Можно отказаться от компоновщиков, но... это чревато.

PS не вижу простых вариантов без костылей этого сделать. Засим откланиваюсь.


Название: Re: Движение виджетов
Отправлено: BuRn от Января 28, 2012, 12:33
QPropertyAnimation +QStateMashine уже не в моде нынче ?


Название: Re: Движение виджетов
Отправлено: lighting от Января 29, 2012, 11:18
BuRn топикстартеру нужен Qt 3.3 так что мимо кассы.


Название: Re: Движение виджетов
Отправлено: ammaximus от Февраля 02, 2012, 13:36
Компоновщики действительно мешают. Плакала моя анимация.


Название: Re: Движение виджетов
Отправлено: Bepec от Февраля 02, 2012, 22:19
Есть интересная мысль. Если виджеты одной формы, то можно накладывать поверх них гифку и проигрывать. Будет так желанная вами анимация, а виджеты просто меняете местами в компоновщике.

PS конечн сумасшедшая, но идея !!! :D


Название: Re: Движение виджетов
Отправлено: andrew.k от Февраля 02, 2012, 23:20
А давно ли QTableItem стал виджетом? Как ты его двигать собираешься?

Не мучай попу, бери qt4. Делай сцену и будет тебе счастье)

Как вариант. Грабить строчку - получаешь пиксмап, которую ты собираешься двигать.
Пихаешь его в виджет, QLabel видимо, показываешь его поверх своей строки (реальной строки в таблице).
Удаляешь строчку из таблицы. Двигаешь виджет с картинкой куда тебе надо.
Вставляешь строку. Скрываешь виджет.
Но это трындец. Проще просто выделить перемещенный элемент и поставить на него фокус (прокрутить таблицу, чтобы стал виден)
Если пользователь не даун, он вкурит.