QComboBox с QTableView, выбором или проблемой фокуса, когда всплывающие элементы выпадающего списка - PullRequest
0 голосов
/ 25 октября 2018

Я изменил стандартное представление элементов комбинированного списка, используя QTableView .

Проблема в с настройкой выбора.Я установил QAbstractItemView::SelectRows для вида, и он отлично работает, когда я наведу курсор на строки QTableView (см. setup_table_view и рис. 2).

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

Я пытался поиграть с параметрами режима выделения, но безуспешно.

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

PS Я сделал курсор коричневым для лучшей контрастности.


Рис.1: курсор мыши в том же месте, где произошел щелчок.

0_1540454500496_11.PNG

Рис.2: курсор мыши был перемещен в 1-й ряд.

1_1540454500496_22.PNG


Вот упрощенный код:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QStandardItemModel *model = get_model(); // here I get the model (see below).

    QTableView *cbxView = new QTableView(this);

    // I define the model for the view to set static column width   
    cbxView->setModel(model); 

    setup_table_view(cbxView); // set view prorerties (see below)

    // set up my combobox with model and view
    ui->comboBox->setModelColumn(1);
    ui->comboBox->setView(cbxView);
    ui->comboBox->setModel(model);
}

/*
 *  Here I set up the view properties
 */
void setup_table_view(QTableView * view)
{
    view->setSelectionMode(QAbstractItemView::SingleSelection);

    // I said about the the line below in problem description
    view->setSelectionBehavior(QAbstractItemView::SelectRows);     

    view->setColumnWidth(0, 30);
    view->horizontalHeader()->setStretchLastSection(true);
    view->verticalHeader()->setStretchLastSection(true);

    view->verticalHeader()->hide();
    view->horizontalHeader()->hide();
}

/*
 *  My model stub (for example). You can skip it. 
 *  It is not important. But maybe it can be useful for someone.
 */
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;
}

1 Ответ

0 голосов
/ 25 октября 2018

Вам нужно переопределить QTableView и переопределить showEvent

void MyTable::showEvent(QShowEvent *e)
{
    if (e->type() == QShowEvent::Show)
    {
       this->selectRow(0);
    }
}

И установить этот класс как представление для выпадающего списка

...