QTableView - 没有得到选择改变信号

Posted

技术标签:

【中文标题】QTableView - 没有得到选择改变信号【英文标题】:QTableView - Not Getting Selection Changed Signal 【发布时间】:2011-12-21 16:23:40 【问题描述】:

我对 QT 还很陌生,无法理解如何处理 QTableView 选择更改信号。我已经设置了一个带有 openGL 小部件和 QTableView 的窗口。我有一个正确填充表格视图的数据模型类,因此我向该类添加了一个公共插槽:

class APartsTableModel : public QAbstractTableModel

public:
    AVehicleModel *vehicle;
    explicit APartsTableModel(QObject *parent = 0);

    //MVC functions
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &paret) const;
    QVariant data(const QModelIndex &index, int role) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;

public slots:
    void selectionChangedSlot(const QItemSelection &newSelection,
                              const QItemSelection &oldSelection);

;

当我准备好显示带有表格视图的窗口时,我会像这样分配/初始化它:

//create the display view
AStarModelView *displayWindow = new AStarModelView(this,
                                                   starModel->vehicle);

//create the datamodel for the table view
APartsTableModel *dataModel = new APartsTableModel(displayWindow);
dataModel->vehicle = starModel->vehicle;

//create selection model for table view
QItemSelectionModel *selModel = new QItemSelectionModel(dataModel);
displayWindow->materialsTable->setSelectionModel(selModel);

//setup model and signal
displayWindow->materialsTable->setModel(dataModel);

connect(selModel,
        SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
        dataModel,
        SLOT(selectionChangedSlot(const QItemSelection &, const QItemSelection &)));

//show the view
displayWindow->show();

当我在 slot 函数的实现中设置断点时,我从来没有命中它。我也尝试过不分配新的QItemSelectionModel,但这也不起作用。我真的不确定我在这里做错了什么。

【问题讨论】:

【参考方案1】:

当您在视图上调用 setModel() 时,您本地分配的 QItemSelectionModel 将被视图创建的替换。无论如何,您不必创建自己的选择模型。只需将您的连接更改为

connect(displayWindow->materialsTable->selectionModel(),
        SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
        dataModel,
        SLOT(selectionChangedSlot(const QItemSelection&, const QItemSelection&)));

【讨论】:

抱歉,重新阅读您的问题,我看到“我尝试不分配新的 QItemSelectionModel,但这也不起作用。”也许这不是正确的答案,尽管当您调用 setModel 时,您的本地选择模型确实会被替换。您还应该确保视图上的 SelectionMode 不是 QAbstractItemView::NoSelection。 我已将 SelectRow 和 SelectItem 都设置为 SelecionMode,但似乎都没有帮助。我还将 setModel() 调用移到了 setSelectionModel() 调用之上,以避免替换新的选择模型。还是没有运气。 您是否尝试连接到 currentChanged() 信号而不是 selectionChanged()? 当信号/插槽似乎无法正常工作时,您应该在 QT 中检查的第一件事是什么?您的班级中有 Q_OBJECT 宏。将此添加到 APartsTable 类定义中,现在我正在打断点。星期五什么时候到?【参考方案2】:

当信号/插槽似乎无法正常工作时,您应该在 QT 中检查的第一件事是什么?您的班级中有 Q_OBJECT 宏。将此添加到 APartsTable 类定义中,现在我正在打断点。

星期五什么时候到?

【讨论】:

【参考方案3】:

只是为了从讨论中提取答案:

当信号/槽不存在时,您应该在 QT 中检查的第一件事是什么 似乎工作正常?你的班级有 Q_OBJECT 宏 在里面。将此添加到 APartsTable 类定义中,现在我 打断点

【讨论】:

【参考方案4】:

virtual Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const 必须返回Qt::ItemIsSelectable | otherFlags

【讨论】:

以上是关于QTableView - 没有得到选择改变信号的主要内容,如果未能解决你的问题,请参考以下文章

QTableView 没有行区的信号

“行高改变”的 QTableView 信号或事件

Qt:在编辑 QTableView 项目数据时而不是在编辑完成后发出信号?

在 Qt 中为 QTableView 创建弹出菜单

Linux QT 中控件QTableView相应鼠标事件

Qt QtableView中如何得到任意一行的数据