Russian Qt Forum

Qt => Вопросы новичков => Тема начата: wildcat от Февраль 09, 2012, 09:39



Название: QtableWidget - выделение строк.
Отправлено: wildcat от Февраль 09, 2012, 09:39
можно в tableWidget запретить выделение столбцов, запретить выделение ячеек, что бы всегда выделялась только строка, ячейку которой выделяют?


Название: Re: QtableWiget - выделение строк.
Отправлено: Авварон от Февраль 09, 2012, 10:00
Разрешаю.


Название: Re: QtableWidget - выделение строк.
Отправлено: stima от Февраль 09, 2012, 11:02
просто погугли, тема расжована на все 100%


Название: Re: QtableWidget - выделение строк.
Отправлено: wildcat от Февраль 09, 2012, 11:05
Конечно гуглю, просто если этим уже тут кто то пользовался, может подскажет )))


Название: Re: QtableWidget - выделение строк.
Отправлено: wildcat от Февраль 09, 2012, 11:25
Вот еще есть вопрос... не найду не где... Есть tableWidget, в нем столбцы поменял местами horizontalHeader()->moveSection(). Но по умолчанию, столбцы остались с первоначальным индексом... Потому как решил поменять ширину столбца с индексом 0-ль... а меняется столбец где-то в середине.... Как можно обновить индексы?


Название: Re: QtableWidget - выделение строк.
Отправлено: GreatSnake от Февраль 09, 2012, 11:43
Код
C++ (Qt)
int QHeaderView::logicalIndex ( int visualIndex ) const
nt QHeaderView::visualIndex ( int logicalIndex ) const


Название: Re: QtableWidget - выделение строк.
Отправлено: wildcat от Февраль 09, 2012, 15:16
Спасибо. Помогло.
Вот нигде не нашел, как запретить выделение столбцов и ячейки, а разрешить выделение только строки. Может кто сталкивался с такой проблемой?


Название: Re: QtableWidget - выделение строк.
Отправлено: mutineer от Февраль 09, 2012, 15:20
http://doc.crossplatform.ru/qt/4.7.x/qtablewidget-members.html

тут есть


Название: Re: QtableWidget - выделение строк.
Отправлено: Пантер от Февраль 09, 2012, 15:23
http://doc.crossplatform.ru/qt/4.7.x/qtablewidget-members.html

тут есть
Как тонко ты сказал RTFM. :)


Название: Re: QtableWidget - выделение строк.
Отправлено: mutineer от Февраль 09, 2012, 15:27
http://doc.crossplatform.ru/qt/4.7.x/qtablewidget-members.html

тут есть
Как тонко ты сказал RTFM. :)

Ну там же правда есть :D


Название: Re: QtableWidget - выделение строк.
Отправлено: wildcat от Февраль 09, 2012, 15:28
копаю )))


Название: Re: QtableWidget - выделение строк.
Отправлено: wildcat от Февраль 09, 2012, 15:51
Как понимаю где то тут копать нужно...

enum QAbstractItemView::SelectionBehavior

                         Константа           Значение   Описание
QAbstractItemView::SelectItems           0   Selecting single items.
QAbstractItemView::SelectRows           1   Selecting only rows.
QAbstractItemView::SelectColumns   2   Selecting only columns.

Делаю так:

Код
C++ (Qt)
tableWidget->selectionBehavior(QAbstractItemView::SelectRows);
компилятор ругается... в qt вообще не силен...


Название: Re: QtableWidget - выделение строк.
Отправлено: sudo от Февраль 09, 2012, 15:52
selectionBehavior в SelectRows
selectionMode в SingleSelection

будет выделяться только строго одна строка


Название: Re: QtableWidget - выделение строк.
Отправлено: Пантер от Февраль 09, 2012, 15:53
setSelectionBehavior же.


Название: Re: QtableWidget - выделение строк.
Отправлено: sudo от Февраль 09, 2012, 15:53
Код
C++ (Qt)
tableWidget->selectionBehavior(QAbstractItemView::SelectRows);
компилятор ругается... в qt вообще не силен...

Конечно, ругается. Используй соответствующие сеттеры: setSelectionBehavior и setSelectionMode ;)


Название: Re: QtableWidget - выделение строк.
Отправлено: wildcat от Февраль 09, 2012, 15:55
Так и надо.. что бы больше одной строки не выделялось


Название: Re: QtableWidget - выделение строк.
Отправлено: wildcat от Февраль 09, 2012, 16:06
Вот:
Код
C++ (Qt)
tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
     tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);

Спасибо огромное))) Что бы делал без Вас))


Название: Re: QtableWidget - выделение строк.
Отправлено: billy4685 от Ноябрь 24, 2015, 12:06
Не хочется открывать новую тему по вопросу выделения ячеек в таблице. Решил, задам свой вопрос здесь. Думаю владелец этой темы будет не против))

У меня следующий вопрос. Как можно в QTableWidget реализовать выделение только строк и столбцов?

Тоесть чтобы ячейка не выделялась, а выделялись только выбранный столбец или выбранная строка. Уже час ищу, ничего не нахожу.


Название: Re: QtableWidget - выделение строк.
Отправлено: GreatSnake от Ноябрь 24, 2015, 15:25
Код
C++ (Qt)
void QAbstractItemView::setSelectionBehavior( QAbstractItemView::SelectionBehavior behavior );


Название: Re: QtableWidget - выделение строк.
Отправлено: billy4685 от Ноябрь 25, 2015, 14:13
Код
C++ (Qt)
void QAbstractItemView::setSelectionBehavior( QAbstractItemView::SelectionBehavior behavior );

Пробовал, не помогает. С помощью этого метода можно устанавливать выделение:
- только столбцов - QAbstractItemView::SelectColumns;
- только строк - QAbstractItemView::SelectRows;
- только ячеек - QAbstractItemView::SelectItems.
Пытался применять этот метод следующим образом:
tabel->setSelectionBehavior(QAbstractItemView::SelectColumns | QAbstractItemView::SelectRows);
, но результата это не дало, на это компилятор бьет предупреждение.
Хоть и приложение запустилось, но выделения остались стандартными.
   
   
   


Название: Re: QtableWidget - выделение строк.
Отправлено: __Heaven__ от Ноябрь 25, 2015, 14:38
Попробуйте скомбинировать QAbstractItemView::SelectRows | QAbstractItemView::SelectColumns


Название: Re: QtableWidget - выделение строк.
Отправлено: GreatSnake от Ноябрь 25, 2015, 14:42
Попробуйте скомбинировать QAbstractItemView::SelectRows | QAbstractItemView::SelectColumns
Ну как можно такое советовать ???.
Это же не битовые маски. Тем более постом выше ТС это уже делал.

2 billy4685
На сам деле непонятно чего хочется в итоге.


Название: Re: QtableWidget - выделение строк.
Отправлено: __Heaven__ от Ноябрь 25, 2015, 15:22
Ну как можно такое советовать ???.
упс. извиняюсь


Название: Re: QtableWidget - выделение строк.
Отправлено: __Heaven__ от Ноябрь 25, 2015, 15:27
Наверное правильным будет отслеживать нажатие и через QAbstractItemView::setSelection(const QRect & rect, QItemSelectionModel::SelectionFlags flags) выбирать всё перекрестие


Название: Re: QtableWidget - выделение строк.
Отправлено: Igors от Ноябрь 25, 2015, 15:34
Ну видимо хочется выделять "крестиком", жмет ячейку - и сразу выделяются и строка и столбец. Вряд ли такой причудливый запрос будет штатным. Почему бы не отловить itemSelectionChanged и там добавить в selection чего надо? Ну пресечь рекурс конечно.

[OFF]Билли Джонс, Ваша страсть к UI впечатляет  :)[/OFF]


Название: Re: QtableWidget - выделение строк.
Отправлено: billy4685 от Ноябрь 25, 2015, 16:11
Попробуйте скомбинировать QAbstractItemView::SelectRows | QAbstractItemView::SelectColumns
Ну как можно такое советовать ???.
Это же не битовые маски. Тем более постом выше ТС это уже делал.

2 billy4685
На сам деле непонятно чего хочется в итоге.

Хочу, чтобы в таблице работало только два метода выделения: 1 и 2; а 3-й и 4-й методы выделения вообще не должны работать (см. рисунки ниже).
То есть, чтобы ячейки в таблице не выделялись при нажатии на них левой клавишей мыши, а выделялись только столбцы или строки, при выборе
щелчком мыши соответственно горизонтальных или вертикальных надписей в таблице (на рисунках 1 и 2 показано красным курсором).


Название: Re: QtableWidget - выделение строк.
Отправлено: GreatSnake от Ноябрь 25, 2015, 16:23
Хм... хотелка ещё та...
Стандартными средствами не сделаешь.

Вот, имхо, самый простой вариант через подмену QItemSelectionModel:
Код
C++ (Qt)
#define VIA_HACK
 
#ifdef VIA_HACK
static inline QObject* getSender( QObject* o )
{
struct _ObjectP_ : QObject
{
_ObjectP_( QObject* p = 0 ) : QObject( p ) {}
QObject* sender() const { return QObject::sender(); }
};
return ( (_ObjectP_*) o )->sender();
}
#endif // VIA_HACK
 
class SelectionModel : public QItemSelectionModel
{
public:
SelectionModel( QAbstractItemModel* model, QObject* parent )
: QItemSelectionModel( model, parent ) {}
void select( const QItemSelection& selection, QItemSelectionModel::SelectionFlags command ) override
{
#ifdef VIA_HACK
if( qobject_cast< QHeaderView* >( getSender( parent() ) ) )
#else
auto sl = selection.indexes();
if( ( sl.first().row() == sl.last().row() &&
sl.first().column() == 0 && sl.last().column() == model()->columnCount() - 1 ) ||
( sl.first().column() == sl.last().column() &&
sl.first().row() == 0 && sl.last().row() == model()->rowCount() - 1 ) )
#endif
QItemSelectionModel::select( selection, command );
}
};
 
SelectionModel selm( tableWidget->model(), tableWidget );
tableWidget->setSelectionModel( &selm );
 

Через хак (VIA_HACK) просто и на все случаи :)


Название: Re: QtableWidget - выделение строк.
Отправлено: Igors от Ноябрь 26, 2015, 09:33
Код
C++ (Qt)
struct _ObjectP_ : QObject
{
_ObjectP_( QObject* p = 0 ) : QObject( p ) {}
QObject* sender() const { return QObject::sender(); }
};
 
Тут мне один академик показал что можно и так
Код
C++ (Qt)
struct _ObjectP_ : public QObject {
using QObject::sender;
};
 


Название: Re: QtableWidget - выделение строк.
Отправлено: billy4685 от Ноябрь 28, 2015, 15:34
GreatSnake, Igors спасибо, буду пробовать цеплять это для своего приложения.