QTableView - 无法获取选择更改信号

4

我对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();

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

4
当您在视图上调用setModel()时,您本地分配的QItemSelectionModel将被由视图创建的模型替换。您不应该自己创建选择模型。只需更改连接内容即可:
connect(displayWindow->materialsTable->selectionModel(),
        SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
        dataModel,
        SLOT(selectionChangedSlot(const QItemSelection&, const QItemSelection&)));

抱歉,我刚刚重新阅读了您的问题,并看到“我尝试过不分配新的QItemSelectionModel,但那也没有起作用。”也许这不是正确的答案,尽管当您调用setModel时,本地选择模型将被替换。您还应确保视图上的SelectionMode不是QAbstractItemView :: NoSelection。 - kenrogers
我已将SelectionMode设置为SelectRow和SelectItem,但似乎都没有帮助。我还将setModel()调用移到了setSelectionModel()调用之前,以避免替换新的选择模型。但仍然没有成功。 - JeffW
你尝试连接 currentChanged() 信号而不是 selectionChanged() 吗? - kenrogers
当信号/槽似乎无法正常工作时,在QT中你应该首先检查什么?那就是你的类是否有Q_OBJECT宏。将其添加到APartsTable类定义中,现在我正在命中断点。星期五什么时候到? - JeffW

1

当信号/槽似乎无法正常工作时,在QT中你应该首先检查什么?确保你的类中有Q_OBJECT宏定义。将其添加到APartsTable类定义中,现在我正在触发断点。

星期五什么时候到?


0
只是从讨论中提取答案:

当QT的信号/插槽似乎无法正常工作时,你应该检查的第一件事情是什么?那就是你的类是否有Q_OBJECT宏定义。现在将其添加到APartsTable类定义中,我现在遇到了断点

.


-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接