Устанавливаю 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);
}