QComboBox и QTableView, проблема с focus/selection при раскрытии элементов combobox

152
12 марта 2019, 05:30

Я изменил стандартное отображение элементов combobox при помощи QTableView.

Проблема заключается в установке фокуса или в настройке selection. Я установил QAbstractItemView::SelectRows для view и это работает, когда я навожу курсор на строки QTableView (см. setup_table_view и Рис. 2).

Но когда combobox открывается и я не перемещаю курсор на элементы combobox, то тогда получается выбрана ячейка одного столбца (который определен при помощи setModelColumn, см. Рис. 1).

Я пробовал использовать опции selection mode, но безрезультатно.

Итак, как можно установить выделение для всей строки, когда combobox открывается при клике (другими словами получить результат из Рис.2 с позицией курсора из Рис. 1)?

P.S. Я изменил цвет курсора для повышения контрастности.

Pic. 1: Курсор находится на том же месте, где произошел клик.

Pic. 2: Курсор был перемещен на первую строку в QTableView.

Пример кода (результат выполнения соответствует изображениям, а файл mainwindow.h без изменений):

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QStandardItemModel *model = get_model(); // получаю модель (см. ниже)
    QTableView *cbxView = new QTableView(this);
    // задаю модель для view, чтобы установить статическую ширину столбца   
    cbxView->setModel(model); 
    setup_table_view(cbxView); // настраиваю свойства view (см. ниже)
    ui->comboBox->setModelColumn(1);
    ui->comboBox->setView(cbxView);
    ui->comboBox->setModel(model);
}
/****  Здесь настраиваю свойства для view   ****/
void setup_table_view(QTableView * view)
{
    view->setSelectionMode(QAbstractItemView::SingleSelection);
    // эта строка указана в описании проблемы
    view->setSelectionBehavior(QAbstractItemView::SelectRows); 
    view->setColumnWidth(0, 30);
    view->horizontalHeader()->setStretchLastSection(true);
    view->verticalHeader()->setStretchLastSection(true);
    view->verticalHeader()->hide();
    view->horizontalHeader()->hide();
}
/****   Пример модели для полного примера   ****/
QStandardItemModel* get_model()
{
    QString names[] = {"Alex", "Tim", "Mary", "Ben", "Nicole", "Max"};
    QString indexes[] = {"1", "3", "6", "5", "4", "2"};
    QString addresses[] = {
        "Alex address", "Tim address", "Mary address",
        "Ben address", "Nicole address", "Max address"
    };
    QStandardItemModel *model = new QStandardItemModel;
    for(int i = 0; i < 6; i++)
    {
        model->setItem(i, 0, new QStandardItem(indexes[i]));
        model->setItem(i, 1, new QStandardItem(names[i]));
        model->setItem(i, 2, new QStandardItem(addresses[i]));
    }
    return model;
}
Answer 1

Решил проблему, переопределив showEvent у QTableView. Этот пост помог мне.

Я сделал что-то наподобие этого:

class MyTableView : public QTableView
{
    Q_OBJECT
public:
    explicit MyTableView(QWidget *parent=0) : QTableView(parent) {}
protected:
    void showEvent(QShowEvent *e)
    {
        if (e->type() == QShowEvent::Show)
            this->selectRow(this->currentIndex().row());
    }
};
READ ALSO
как из boost::filter_iterator получить исходный итератор?

как из boost::filter_iterator получить исходный итератор?

Наверное в std::lower_bound надо было передавать begin и end, а то они не используютсяА получить исходный итератор можно через lower

156
Решить методом встречи посередине! [закрыт]

Решить методом встречи посередине! [закрыт]

Найти количество подмножеств чья сумма меньше или равна указанного числа К; Ограничения: максимальное число элементов множества n = 40, каждое...

184
Двоеточие в определении конструктора

Двоеточие в определении конструктора

У меня возникла проблема с пониманием синтаксисаУвидел вот такой конструктор:

174