selectedIndexes() 返回的 QModelIndexList 始终为空

Posted

技术标签:

【中文标题】selectedIndexes() 返回的 QModelIndexList 始终为空【英文标题】:QModelIndexList returned by selectedIndexes() is always empty 【发布时间】:2019-09-17 12:35:57 【问题描述】:

我在QTabWidget 中有一个QTableView,每次按下按钮时,我都会在其中输入6 列的新行。在 6 列中,有 3 列设置了 QPushButton。我需要来自QTableView 的单击按钮的行号。我已将QPushButton clicked 信号连接到我的插槽clickedIndex()

这就是我试图获取单击按钮的行索引但列表为空的方式。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>

MainWindow::MainWindow(QWidget* parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

   ui->setupUi(this);

   m_view = new QTableView(this);
   m_model = new QStandardItemModel(m_view);
   m_model->setColumnCount(6);

   m_view->setModel(m_model);
   m_model->insertRow(0);

   QPushButton* button = new QPushButton(this);
   button->setText("Click");

   m_view->setIndexWidget(m_model->index(0, 2), button);

   m_model->insertRow(1);

   QPushButton* button1 = new QPushButton(this);
   button1->setText("Click");

   m_view->setIndexWidget(m_model->index(1, 3), button1);

   connect(button, &QPushButton::clicked, this, &MainWindow::tableViewClicked);
   connect(button1, &QPushButton::clicked, this, &MainWindow::tableViewClicked);

   setCentralWidget(m_view);



MainWindow::~MainWindow()

    delete ui;




QModelIndex MainWindow::tableViewClicked()

    //get the list of currently selected indexes from the model
    QModelIndexList indexList = m_view->selectionModel()->selectedIndexes();

    if (!indexList.isEmpty())
    
        qDebug() << indexList.front().row(); //prints 0 all the time

        //usually the list should contain only one index at a time
        return indexList.front();
    

这是标题:

#include <QMainWindow>
#include <QModelIndex>
#include <QTableView>
#include <QStandardItemModel>

namespace Ui

    class MainWindow;


class MainWindow : public QMainWindow

        Q_OBJECT

    public:
        explicit MainWindow(QWidget* parent = 0);
        ~MainWindow();

    public slots:

        QModelIndex tableViewClicked();

    private:
        Ui::MainWindow* ui;
        QTableView* m_view;
        QStandardItemModel* m_model;
;

我还尝试连接来自QTableViewpressed 信号,但从未调用过该插槽。

connect(m_ui->tableView, &QTableView::pressed, this, &TabView::clickedIndex);

我相信如果QTableView 模型中的一个单元格上有QWidget,则永远不会调用该插槽。当我点击不带按钮的单元格时,连接有效。

我需要:

我只需要 QModelIndex 到模型中单击的按钮。

注意:我使用的是 Qt 5.7.1,我发现了一些与 selectedIndexes() 相关的错误报告,例如 this

有解决办法吗?

编辑:在我的代码中,QModelIndexList 本身是空的。

【问题讨论】:

我不确定,但我认为单击QPushButton 也不会选择底层行。但我可能错了。如果您想要快速而有用的答案,请考虑提供一个最小且可重现的示例。 @Fareanor 正如你所建议的,我已经加入了 MVCE。我也相信点击QPushButton不会选择底层行。上面的代码一直打印 0。 【参考方案1】:

这是一种做你想做的事的方法。

connect(button, &QPushButton::clicked, this, [this, button, view] 
  qDebug() << view->indexAt(button->pos()).row();
);

【讨论】:

【参考方案2】:

您可以从 TableView 中获得“点击”信号。 要获取索引,可以使用以下代码:

connect(m_ui->tableView, SIGNAL(clicked(QModelIndex)), this, 
SLOT(slotClicked(QModelIndex)));

头文件中的Slot:

void slotCLicked(const QModelIndex &index);


void XY::slotClicked(const QModelIndex &index)

    qDebug() << index;

【讨论】:

pressedand clicked 仅适用于不包含小部件的单元格。这对我不起作用。

以上是关于selectedIndexes() 返回的 QModelIndexList 始终为空的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 QListWidget 中的所有选定项目?

如何从索引列表中选择 QtableWidget 中的单元格

QtQModbusServer类

QtQModbusRequest类

Qt / PyQt 简易毛玻璃效果

QT在子窗口外单击关闭子窗口