Может ли текст элементов QComboBox состоять из 2 цветов? - PullRequest
0 голосов
/ 23 ноября 2018

Например, для строки "Элон Маск":

  • Цвет текста "Элон" красный;
  • Цвет текста "Мускус" зеленый;

Заранее благодарим за любую помощь, которую вы можете оказать

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Вы можете играть с Qt :: ItemDataRole, чтобы обеспечить настройки.Для этого конкретного случая -

#include <QApplication>
#include <QComboBox>
#include <QColor>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QComboBox box;
    box.addItem("Elon");
    box.addItem("Musk");

    box.setItemData(0, QColor(Qt::red), Qt::ForegroundRole);
    box.setItemData(1, QColor(Qt::green), Qt::ForegroundRole);

    box.show();

    return a.exec();
}

Скриншоты для справки -

enter image description here enter image description here

0 голосов
/ 23 ноября 2018

В качестве альтернативного подхода к использованию делегатов я бы использовал QLabel с расширенным текстом (в кодировке HTML), чтобы закрасить текст элемента комбинированного окна.Мне также нужно реализовать фильтр событий для обработки нажатия (выбора) «пользовательских» элементов.Следующий пример демонстрирует, как это сделать:

class Filter : public QObject
{
public:
  Filter(QComboBox *combo)
    :
      m_combo(combo)
  {}
protected:
  bool eventFilter(QObject *watched, QEvent * event) override
  {
    auto lbl = qobject_cast<QLabel *>(watched);
    if (lbl && event->type() == QEvent::MouseButtonRelease)
    {
      // Set the current index
      auto model = m_combo->model();
      for (int r = 0; r < model->rowCount(); ++r)
      {
        if (m_combo->view()->indexWidget(model->index(r, 0)) == lbl)
        {
          m_combo->setCurrentIndex(r);
          break;
        }
      }
      m_combo->hidePopup();
    }
    return false;
  }

private:
  QComboBox *m_combo;
};

А вот как добавить «цветные» элементы в поле со списком и обработать их:

QComboBox box;
box.setEditable(true);
Filter filter(&box);

// Add two items: regular and colored.
box.addItem("A regular item");
box.addItem("Elon Musk");

// Handle the colored item. Color strings using HTML tags.
QLabel lbl("<font color=\"red\">Elon </font><font color=\"green\">Musk</font>", &box);
lbl.setAutoFillBackground(true);
lbl.installEventFilter(&filter);
box.view()->setIndexWidget(box.model()->index(1, 0), &lbl);

box.show();
0 голосов
/ 23 ноября 2018

Да, это возможно.На самом деле вы можете делать там все, что захотите, используя QItemDelegate .Внутри делегата вы можете делать все сумасшедшие вещи, которые вы хотите, включая не только цвет, но также кнопки и другие элементы управления.

...