Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QComboBox со столбцами.


Автор: Diablus 11.2.2012, 19:42
Добрый вечер товарищи. 
Столкнулся со спецефичным требованием - нужно что бы при нажатии на элемент QComboBox (список) появлялся не обычный одно-столбцовый список, а двух столбцовый.
Установка перегруженной табличной модели не помогла. 
Единственная мысль - создавать собственный элемент - перегружать к примеру кнопку + создавать окошко, с установкой сигналов/слотов.
Возможно можно получить указатель на POP-окно QComboBox'а?
Поделитесь опытом?

Автор: math64 11.2.2012, 19:55
Кроме модели, нужно поменять view методом setView()  - но не пробовал.

Автор: borisbn 11.2.2012, 21:15
я делал проще - каждый элемент состоял из двух
Цитата
itemFromColumn0 + "\t" + itemFromColumn1

Автор: Diablus 11.2.2012, 21:51
To math64
Мысль о перегрузке item-делегатов приходила на ум, однако разве не отсекается инфа уже в коде QComboBox? Попробую, если не найду иных вариантов.
To borisbn 
Идея интересная, однако в каждой строчке (обоих столбцов) помимо текста должен присутствовать элемент QCheakBox, разделение пробелами не вариант.

Автор: math64 11.2.2012, 22:34
Ну  неслучайно же void QComboBox::setView ( QAbstractItemView * itemView ) а не void QComboBox::setView ( QListView * itemView ).
Значит, туда можно попробовать засунуть QTableView или QTreeView.
Конечно, не будут работать setItemIcon(), setItemText() и пр. методы, рассчитанные на одну колонку. Устанавливать данные придётся непосредственно через модель, а делегатов - через вид таблицы.
Не будет, вероятно работать и редактор - void QComboBox::setLineEdit ( QLineEdit * edit ), а не QWidget*, как у делегатов.
Но не пробовал.
Если не получится - делать, как делал borisbn (можно написать proxyModel, отображающую tableModel в одну колонку и делегата, отображающего одну колонку как несколько.

Автор: loneybibi 12.2.2012, 02:08
Для QComboBox::setView() ставишь QTreeView, а у дерева уже задаешь 2 колонки и заполняешь его элементами.

Автор: Diablus 12.2.2012, 08:51
Цитата(loneybibi @ 12.2.2012,  02:08)
Для QComboBox::setView() ставишь QTreeView, а у дерева уже задаешь 2 колонки и заполняешь его элементами.

Перегружал, заполнял две колонки, отображается только одна.
Есть такая функция QComboBox::SetColumnView(int) задающая как раз номер отображаемой колонки.

Автор: math64 12.2.2012, 13:07
Покопайся в исходиниках, посмотри почему так выходит. Вероятно, QComboBox создаёт свой QListView взамен  QTableView после твоего вызова setView().
Если не получится - делай как borisbn.
Если данные выбираются из базы данных, запрос (для sqlite)
Код

select column1 || ',' || column2 || ',' || column3 from table; 

Делегат потом режет split(',') и выводит отдельными колонками.

Автор: math64 12.2.2012, 15:44
Вот комбо-бокс с таблицей:
Код

#include <QtGui/QApplication>
#include <QtGui/QTableView>
#include <QtGui/QComboBox>
#include <QtGui/QFileSystemModel>
int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  QFileSystemModel model;
  model.setRootPath(".");
  QTableView& table = *new QTableView;
  QComboBox cb;
  cb.setModel(&model);
  cb.setRootModelIndex(model.index("."));
  cb.setView(&table);
  //!!! Установите модель после setView() !!!
  table.setModel(&model);
  table.setRootIndex(model.index("."));
  cb.setMinimumWidth(500);
  cb.show();
  return app.exec();
}

Но в свёрнутом виде показывает одну колонку - ту, что была выбрана.
Но я думаю, это можно переопределить в производном классе.

Автор: teatorb 13.9.2022, 16:53
Модератор: Сообщение скрыто.

Автор: Queuego 5.11.2022, 05:34
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)