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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QComboBox с QTableView в качестве выпадающего списка  (Прочитано 7464 раз)
asvil
Гость
« : Май 24, 2010, 08:04 »

Устанавливаю QTableView в QComboBox в качестве представления. Назначаю модель для QComboBox. Выпадающий виджет содержит QTableView, ничего не предвещает ошибок. Однако...
Проблема №1:
Если модель содержит несколько столбцов, то при выборе значения из колонки не равной QComboBox::modelColumn() в QComboBox устанавливается выбранное значение, вместо index(QComboBox::currentIndex(), QComboBox::modelColumn())
Решение для нередактируемого комбобокса:
Код:
void FancyComboBox::paintEvent(QPaintEvent *event)
{
  //QComboBox::paintEvent(event);

  QStylePainter painter(this);

  //painter.setPen(palette().color(QPalette::Text));

  // draw the combobox frame, focusrect and selected etc.
  QStyleOptionComboBox opt;
  initStyleOption(&opt);

  painter.drawComplexControl(QStyle::CC_ComboBox, opt);

  // Workaround
  opt.currentText = model()->index(currentIndex(), modelColumn(), rootModelIndex()).data(Qt::DisplayRole).toString();

  painter.drawControl(QStyle::CE_ComboBoxLabel, opt);

}
Лучше конечно переопределить QComboBox::setView, подключиться к QTableView::currentChanged(), и запоминать значение выбранного индекса в переменной.
Проблема №2:
При установке для QTableView минимальной высоты равной высоте экрана, под win* выпадающий список уходит за пределы экрана. Такое свойство проявляется только если QComboBox находиться выше середины экрана. Если QComboBox находиться ниже середины, выпадающий список ведет себя как надо, выпадая сверху и до низа экрана. Но тогда маленький недочет заключается в том, что выпадающий список закрывает QComboBox, что на мой взгляд не совсем корректно.
Решение:
После показа всплывающего окна я его перемещаю туда, куда мне нужно. Однако я получаю при этом мерцание.
Код:
void FancyComboBox::showPopup()
{
  QComboBox::showPopup();

  QWidget *container = view()->parentWidget();
  QRect viewRect = container->rect();

  QDesktopWidget *desktop = qApp->desktop();

  QRect availableRect = desktop->availableGeometry(this);
  QRect containerRect = QRect(mapToGlobal(viewRect.topLeft()), mapToGlobal(viewRect.bottomRight()));

  qDebug() << " available rect" << availableRect;
  qDebug() << " old global view rect" << containerRect;
  qDebug() << " view rect" << viewRect;

  if (containerRect.height() > availableRect.height())
    containerRect.setHeight(availableRect.height());
  if (containerRect.width() > availableRect.width())
    containerRect.setWidth(availableRect.width());

  if (containerRect.left() < availableRect.left())
    containerRect.moveRight(availableRect.left() + (containerRect.width() - 1));

  if (containerRect.top() < availableRect.top())
    containerRect.moveBottom(availableRect.top() + (containerRect.height() - 1));

  if (containerRect.right() > availableRect.right())
    containerRect.moveLeft(availableRect.right() - (containerRect.width() - 1));

  if (containerRect.bottom() > availableRect.bottom())
    containerRect.moveTop(availableRect.bottom() - (containerRect.height() - 1));

  QRect comboRect = QRect(mapToGlobal(this->rect().topLeft()), mapToGlobal(this->rect().bottomRight()));
  if (comboRect.intersects(containerRect)) {
    if (comboRect.right() + containerRect.width() < availableRect.right())
      containerRect.moveLeft(comboRect.right());
    else if (comboRect.left() - containerRect.width() > availableRect.left())
      containerRect.moveRight(comboRect.left());
  }

  qDebug() << " new global view rect" << containerRect;

  container->setGeometry(containerRect);

}
Записан
stiffx2010
Гость
« Ответ #1 : Август 11, 2011, 07:30 »

А можно попросить кусок кода, где Вы устанавливаете выпадающий список в виде QTableView?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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