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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [qt-4.2] Как реализовать такое ?  (Прочитано 6115 раз)
izoomer
Гость
« : Декабрь 20, 2006, 21:14 »

Мне бы сделать список свой от QAbstractItemView. Нет ли у кого примеров (chart не предлагать из примеров)?
Например есть список из восьми итемов вот хотелось быб что бы выглядело так в приложении :
---------------------------
| item_7 ....................|
| item_8 ....................|
|-------------------------|
| item_1.....................|
|-------------------------|
| item_2....................|
| item_3.....................|
---------------------------|

и по кругу при навигации список крутился и выделенный итем по высоте выше остальных (то есть тот что по центру высота больешг чем у отслаьных). Определили своего делегата для автиной и неактивной строки, но по высоте они одинаковые, а если активный выше то залазит на другие.ДУмаю надо переопределять piantEvent у QAbstractItemView. Но не знаю как ...  Грустный  
Вот как такое сделать ?
Готов компенисровать материально время потраченное на мое обучение и консультации ( в аське) :-) совсем в тупике я ...  F1 F1 F1!
Записан
Alexandr Az
Гость
« Ответ #1 : Декабрь 21, 2006, 12:58 »

Нет, piantEvent для itemView здесь никоим боком не влияет. Твоя задача сводится к написанию такого  comboBox, а будет он себя вести в itemView точно также как ты его напишешь.... Так что нуно писать кобобокс тебе. и piantEvent будешь в нём уже мучать..........

добавлено спустя 2 минуты:

 Лучше расскажи конечную задачу, тебе нужен чтобы этот комбобокс всплывал в view?

добавлено спустя 8 минут:

 Я вообще не могу втыкнуть как реализовать такое  с точки зрения пользователя. У нас барабан , на котором написаны значений и он крутится Улыбающийся (если я правильно понимаю). Как в игровых автоматах. Все понятно. Юзвер жмёт кнопу вверх - он крутится на один итем вверх, вниз - аналогичная фигня. Но мыхой, как мыхой итем выбрать, кляцать на нижнем значении чтобы он вертелся? А скролл бар, если оно бесконечное (по кругу ж всё)??.  Не могу представить если честно. Лучше наведи пример, если такая штука где то есть.
Записан
bigirbis
Гость
« Ответ #2 : Декабрь 21, 2006, 13:34 »

Вот, что получилось в первом приближении:
Код:

#ifndef LISTWIDGET_H
#define LISTWIDGET_H

#include <QtGui/QListWidget>

class ListWidget : public QListWidget
{
    Q_OBJECT

public:
    ListWidget( QWidget *parent = 0 );
    ~ListWidget();

private:
int centralRow();
void markCentralItem();
void keyPressEvent( QKeyEvent * );
void replaseItem( bool up = true );
};

#endif // LISTWIDGET_H


Код:

#include "listwidget.h"

#include <QtGui>

ListWidget::ListWidget( QWidget * parent )
    : QListWidget( parent )
{
QStringList items;
items << "0" << "1" << "2" << "3" << "4" << "5" << "6" << "7" << "8" << "9";
addItems( items );
markCentralItem();
}

ListWidget::~ListWidget()
{
}

int ListWidget::centralRow()
{
return ( count() % 2 ) ? count() / 2 : count() / 2 - 1;
}

void ListWidget::markCentralItem()
{
QFont font = item( centralRow() )->font();
font.setPointSize( qApp->font().pointSize() * 2 );
item( centralRow() )->setFont( font );
setCurrentRow( centralRow() );
}

void ListWidget::replaseItem( bool up )
{
if( count() )
{
QFont font = item( centralRow() )->font();
font.setPointSize( qApp->font().pointSize() );
item( centralRow() )->setFont( font );
if( up ) insertItem( 0, takeItem( count() - 1 ) );
else insertItem( count(), takeItem( 0 ) );
markCentralItem();
}
}

void ListWidget::keyPressEvent( QKeyEvent * event )
{
if( event->key() == Qt::Key_Up )
replaseItem( true );
if( event->key() == Qt::Key_Down )
replaseItem( false );
}


Может немного коряво...
Записан
izoomer
Гость
« Ответ #3 : Декабрь 21, 2006, 15:12 »

Цитировать

 Я вообще не могу втыкнуть как реализовать такое  с точки зрения пользователя. У нас барабан , на котором написаны значений и он крутится Улыбающийся (если я правильно понимаю). Как в игровых автоматах. Все понятно. Юзвер жмёт кнопу вверх - он крутится на один итем вверх, вниз - аналогичная фигня. Но мыхой, как мыхой итем выбрать, кляцать на нижнем значении чтобы он вертелся? А скролл бар, если оно бесконечное (по кругу ж всё)??.  Не могу представить если честно. Лучше наведи пример, если такая штука где то есть.


точно !!! именно так .... есть модель с множеством строк (неизменым количеством строк в процессе работы программы) отображаем так как нарисовал  - именно по кругу крутим как барабан в игровых автоматах.
В центре итем центральній - он выделяется по размерам, прорисовывается по другому. Навигация ВВЕРХ ВНИЗ только стрелками курсора . Скролл бар вообще выключен - отсутствует (строки пронумерованы для понимания)
Вот именно так и надо.

добавлено спустя 6 минут:

 
Цитата: "bigirbis"
Вот, что получилось в первом приближении:
Код:

#ifndef LISTWIDGET_H
#define LISTWIDGET_H

#include <QtGui/QListWidget>

class ListWidget : public QListWidget
{
...
...
...



Может немного коряво...

Спасибо.
В общем то -это то - но с небольшими но :
каким образом установить модель для данного view и как установить клонку модели , как это реализовано в QListView ?
как по центру отображать выделенный виджет ?
выделенный виджет выглядит не только шрифтом по другому а весь прориосван в центре по другому . Почему и думал реализовать от QAbstractItemView потому, что с моделями надо работать .

Интересует именно так как я нарисовал и описал в посте выше (принцип как в игровом автомате)
Записан
bigirbis
Гость
« Ответ #4 : Декабрь 21, 2006, 16:46 »

Цитировать
как по центру отображать выделенный виджет ?

void QAbstractItemView::scrollTo ( const QModelIndex & index, ScrollHint hint = EnsureVisible )  [pure virtual]
void QListWidget::scrollToItem ( const QListWidgetItem * item, QAbstractItemView::ScrollHint hint = EnsureVisible )  [slot]

- зависит от выбранного пути.
Цитировать
Почему и думал реализовать от QAbstractItemView потому, что с моделями надо работать .

Думаю, получится некоторый гемор. Но если есть веские основания...
Записан
izoomer
Гость
« Ответ #5 : Декабрь 21, 2006, 17:21 »

Цитировать

Думаю, получится некоторый гемор. Но если есть веские основания...

у меня все данные для отображения сформированы в модели, да плюс по несколько role для каждого итема (сделал делегаты и в них рисую в зависимости от ролей в строке).
По другому не вижу более выгодных задач хранения данных кроме как через модель. Да плюс у меня такой механиз в модели есть корневые узлы и дочерние в одном вивере отображаю корневые а в другом дочерние того итема который в данный момент выбран . В общем такой код:
Код:

    list_1 = new QListView(this);
    list_1->setModel(model);
    list_1->setCurrentIndex(model->index(0, 0));  
    list_1->setFocusPolicy( Qt::NoFocus );
     
    list_2 = new ListView(this);
    list_2->setModel(model);
    list_2->setModelColumn(1);
    list_2->setRootIndex(model->index(0,0));
    connect(list_1, SIGNAL(clicked(const QModelIndex &)), this, SLOT( сhangeItemList_1(const QModelIndex &)));

}
void MainWindow::changeItemList_1 (const QModelIndex &fld){
     list_2->setRootIndex(fld);
}

только вот отобрадения надо сделать такое как описывал в постах выше ... очень надо блин ....
Записан
izoomer
Гость
« Ответ #6 : Декабрь 25, 2006, 00:43 »

ну поделитесь кто нибудь любым примером с QAbstractItemView (chart из примеров непоходит)
Или какой нить пример с переопределенным paintEvent у QListView
полелитесь плиз
Записан
Alexandr Az
Гость
« Ответ #7 : Декабрь 25, 2006, 10:25 »

Так тебе bigirbis отличный пример написал, не пожалел время. Какая разница куда его прикручивать.
Записан
bigirbis
Гость
« Ответ #8 : Декабрь 25, 2006, 10:47 »

Народ, кто может помогите izoomer! Время просто нет...
Там другая фича. Отобразить каталоги по-моему надо.
Плюс, на большом списке все это дичайше тормозит...
Записан
izoomer
Гость
« Ответ #9 : Декабрь 25, 2006, 11:16 »

та не в каталогах дело
модель есть и работает - будет она на QDirModel, или на моей такой же модели разницы никакой .
Требуется сделать отображение так как описано в заголовке поста моего, а для этого нужно переопределять paintEvent у QListView или свой писать вивер от QAbstractItemView (что значительно труднее).
Мне бы пример хотя бы какой то !
bigirbis ты мне покажи куда копать - а я сам дальше .... плиз
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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