【问题标题】:QComboBox with QTableView, selection or focus problem when combobox items pop upQComboBox与QTableView,组合框项目弹出时选择或焦点问题
【发布时间】:2018-10-25 10:30:52
【问题描述】:

我使用 QTableView 更改了组合框项目的标准视图。

问题出在选择的设置上。我为视图设置了QAbstractItemView::SelectRows,当我将光标悬停在 QTableView 的行上时它工作正常(参见setup_table_view 和图 2)。

但是当组合框打开并且我没有将光标移动到组合框项目时,我会看到一列单元格上的选择(使用setModelColumn 定义,参见图 1)。

我尝试使用选择模式选项,但没有成功。

那么,当我单击并弹出组合框时,如何设置我的程序以选择整行(以获得图 2 的结果,光标位置为图 1)?

附:我将光标设置为棕色以获得更好的对比度。


图片。 1:鼠标光标在点击的地方。

图片。 2:鼠标光标移动到第一行。


这是一个简化的代码:

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;
}

【问题讨论】:

    标签: c++ qt qcombobox


    【解决方案1】:

    你需要重新实现QTableView并覆盖showEvent

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

    并将此类设置为组合框的视图

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2013-06-20
      相关资源
      最近更新 更多