c++ QTableWidget整行且单行选择,并添加行选择的函数链接

1.概要

1.使用:QItemSelectionModel::currentRowChanged

const QModelIndex &current
int currentRow = current.row();

2.使用:QTableWidget::itemSelectionChanged

 // 获取当前选中的行
        QList<QTableWidgetSelectionRange> selectedRanges = tableWidget->selectedRanges();
        if (!selectedRanges.isEmpty()) {
            int currentRow = selectedRanges.first().topRow();
            qDebug() << "Selected row:" << currentRow;
            // 在这里添加你需要的处理逻辑
        }

2.内容

#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QApplication>
#include <QTableWidget>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug>

class MyWidget : public QWidget {
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
        QVBoxLayout *layout = new QVBoxLayout(this);

        // 创建 QTableWidget
        tableWidget = new QTableWidget(5, 3, this);  // 5 行 3 列
        tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);  // 单行选择
        tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);    // 整行选择

        // 添加一些数据
        for (int row = 0; row < tableWidget->rowCount(); ++row) {
            for (int column = 0; column < tableWidget->columnCount(); ++column) {
                tableWidget->setItem(row, column, new QTableWidgetItem(QString("Item %1-%2").arg(row).arg(column)));
            }
        }

        layout->addWidget(tableWidget);

        // 连接信号和槽
        // 在构造函数中连接信号和槽
        //这个方案不可能,因为currentChanged是保护函数,如果使用这个方案,将这个链接放到继承QTableWidget的类中
        //connect(tableWidget, &QTableWidget::currentChanged, this, &MyWidget::handleCurrentChanged);
        //这个方案可行
        //connect(tableWidget->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &MyWidget::handleRowChanged);
        //这个方案可行
        connect(tableWidget, &QTableWidget::itemSelectionChanged, this, &MyWidget::handleItemSelectionChanged);
    }

private slots:
    void handleRowChanged(const QModelIndex &current, const QModelIndex &previous) {
        Q_UNUSED(previous); // 如果不需要使用previous索引,可以使用Q_UNUSED来避免编译器警告
        int currentRow = current.row();
        qDebug() << "Selected row:" << currentRow;
        // 在这里添加你需要的处理逻辑
    }
    void handleItemSelectionChanged() {
        // 获取当前选中的行
        QList<QTableWidgetSelectionRange> selectedRanges = tableWidget->selectedRanges();
        if (!selectedRanges.isEmpty()) {
            int currentRow = selectedRanges.first().topRow();
            qDebug() << "Selected row:" << currentRow;
            // 在这里添加你需要的处理逻辑
        }
    }

private:
    QTableWidget *tableWidget;
};
#endif // MYWIDGET_H

#include "MyWidget.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MyWidget widget;
    widget.show();

    return app.exec();
}
 

3.运行结果

1.窗口

2.控制台 

Selected row: 2
Selected row: 3
Selected row: 2
Selected row: 1
Selected row: 0
Selected row: 1
Selected row: 2
Selected row: 3
Selected row: 4 

4.关联知识

1.上面Q_UNUSED(deselected);的作用是啥

在Qt编程中,Q_UNUSED是一个宏,用于标记某个参数在函数体内未被使用。这通常出现在信号与槽的连接中,特别是当信号的参数比槽函数所需的参数多时。使用Q_UNUSED可以避免编译器因未使用的参数而发出的警告。

然而,在你提供的代码示例中,槽函数handleRowChanged实际上有两个参数:currentRowpreviousRow。这两个参数分别表示当前选中的行和之前选中的行。因此,在这个特定的例子中,previousRow参数并不是未使用的,所以理论上不应该使用Q_UNUSED(previousRow);(注意你写的是deselected,这可能是一个笔误,应该是previousRow)。

如果你的槽函数只关心当前选中的行,而不关心之前选中的行,你仍然可以选择不使用previousRow参数,但这不是Q_UNUSED的正确用法。正确的做法是简单地忽略previousRow参数,不在槽函数体内引用它。编译器通常不会为未引用的参数发出警告,除非启用了特定的编译器警告选项。

正确的槽函数定义应该是这样的:

private slots:
    void handleRowChanged(int currentRow, int /* previousRow */) {
        qDebug() << "Selected row:" << currentRow;
        // 你可以在这里添加你需要的处理逻辑
    }

在这个例子中,我使用了C++的注释语法来“忽略”previousRow参数,而不是使用Q_UNUSED。这种方法在视觉上更清晰地表明了哪个参数是故意未被使用的。当然,如果你确实想使用Q_UNUSED来避免编译器警告(尽管在这种情况下通常不需要),你应该这样做:

private slots:
    void handleRowChanged(int currentRow, int previousRow) {
        Q_UNUSED(previousRow);
        qDebug() << "Selected row:" << currentRow;
        // 你可以在这里添加你需要的处理逻辑
    }

但请记住,Q_UNUSED主要用于当你确实有一个未使用的参数,并且你想明确地告诉编译器和阅读代码的人这个参数是故意未被使用的。在你的例子中,如果previousRow有可能在未来被使用,那么最好不要使用Q_UNUSED

2.QTableWidget::itemSelectionChanged

QTableWidget::itemSelectionChanged 是一个在 Qt 框架中使用的信号(signal),它属于 QTableWidget 类。这个信号在表格中的选中项(items)发生变化时被发射(emitted)。简单来说,当用户通过鼠标点击、键盘操作或其他方式改变了表格中选中单元格的集合时,这个信号就会被触发。

使用场景

QTableWidget::itemSelectionChanged 信号非常有用,因为它允许开发者在用户与表格交互时执行特定的操作。例如,你可能想要在用户选择表格中的不同行或列时更新界面的其他部分,或者根据选中的单元格来加载不同的数据。

如何连接信号和槽

在 Qt 中,信号和槽(slot)是用来实现对象间通信的机制。你可以将 QTableWidget::itemSelectionChanged 信号连接到一个槽函数,当信号被发射时,槽函数就会被调用。

以下是一个简单的例子,展示了如何连接这个信号到一个槽函数:

// 假设你有一个 QTableWidget 对象叫做 tableWidget
connect(tableWidget, &QTableWidget::itemSelectionChanged, this, &YourClass::onItemSelectionChanged);

// 在 YourClass 类中定义 onItemSelectionChanged 槽函数
void YourClass::onItemSelectionChanged() {
    // 在这里编写当选中项变化时需要执行的代码
    // 例如,获取当前选中的单元格
    QList<QTableWidgetSelectionRange> selectedRanges = tableWidget->selectedRanges();
    // ... 根据选中的单元格执行操作
}

注意事项

  • 当 QTableWidget 中的选中项变化时,itemSelectionChanged 信号会被发射,无论这个变化是由于用户的操作(如点击)还是由于编程的方式(如通过代码设置选中项)。
  • 你可以通过检查 selectedRanges() 或 selectedItems() 来获取当前选中的单元格或项。
  • 如果你在处理这个信号时进行了大量的计算或操作,考虑将这些操作放到一个单独的线程中,以避免阻塞 UI 线程。

总之,QTableWidget::itemSelectionChanged 信号是处理表格选中项变化时非常有用的工具,它让开发者能够根据用户的交互来动态地更新应用界面或执行其他操作。

3.QTableWidget::currentChanged 

QTableWidget::currentChanged 是 Qt 框架中 QTableWidget 类的一个信号(signal)。这个信号在表格中的当前单元格发生变化时被发射(emit)。换句话说,当用户通过键盘(比如箭头键)或鼠标在表格中选择不同的单元格时,currentChanged 信号就会被触发。

信号细节

  • 信号类型void currentChanged(const QModelIndex &current, const QModelIndex &previous)
  • 参数
    • current:表示当前选中的单元格的模型索引(QModelIndex)。
    • previous:表示之前选中的单元格的模型索引(QModelIndex)。

使用场景

这个信号非常有用,因为它允许开发者在用户更改选择时执行特定的操作。例如,你可能想在用户选择表格中的不同行时,根据选中的行显示不同的信息或更新某些界面元素。

示例代码

下面是一个简单的例子,展示如何连接 currentChanged 信号到一个槽(slot)函数,该函数将在单元格选择变化时被调用:

这里是一个示意代码,不能运行,因为 currentChanged是包含成员
#include <QApplication>
#include <QTableWidget>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug>

class MyWidget : public QWidget {
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
        QVBoxLayout *layout = new QVBoxLayout(this);

        QTableWidget *tableWidget = new QTableWidget(5, 3, this); // 创建一个5行3列的表格
        layout->addWidget(tableWidget);

        // 连接 currentChanged 信号到槽函数
        connect(tableWidget, &QTableWidget::currentChanged, this, &MyWidget::onCurrentChanged);
    }

public slots:
    void onCurrentChanged(const QModelIndex &current, const QModelIndex &previous) {
        qDebug() << "当前选中的单元格:" << current.row() << "," << current.column();
        qDebug() << "之前选中的单元格:" << previous.row() << "," << previous.column();
    }
};

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    MyWidget w;
    w.show();
    return a.exec();
}

在这个例子中,我们创建了一个 QTableWidget,并连接了它的 currentChanged 信号到 MyWidget 类的 onCurrentChanged 槽函数。每当用户在表格中选择不同的单元格时,onCurrentChanged 函数就会被调用,并打印出当前和之前选中的单元格的行和列信息。

4.QItemSelectionModel::currentRowChanged 

QItemSelectionModel::currentRowChanged 是一个信号(signal),在 Qt 框架中用于指示模型中的当前行发生了变化。这个信号由 QItemSelectionModel 类发出,当用户在视图(如 QTableViewQTreeView 等)中选择不同的行时,这个信号就会被触发。

参数

  • current: 这是一个 QModelIndex 对象,表示新的当前行的索引。QModelIndex 是 Qt 中用于定位模型中项目的索引类。
  • previous: 这也是一个 QModelIndex 对象,表示之前被选中的行的索引。如果之前没有选中的行,这个参数可能会是一个无效的索引。

使用场景

你可以连接这个信号到一个槽(slot)函数,以便在用户改变选择时执行特定的操作。例如,你可能想要在用户选择一个新的行时更新界面的某些部分,或者加载与该行相关的数据。

示例代码

下面是一个简单的示例,展示了如何连接 currentRowChanged 信号到一个槽函数:

#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include <QDebug>

void onCurrentRowChanged(const QModelIndex &current, const QModelIndex &previous) {
    qDebug() << "当前行变为:" << current.row() << "之前选中的行是:" << previous.row();
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QTableView tableView;
    QStandardItemModel model(5, 1); // 5行1列的模型
    for (int row = 0; row < 5; ++row) {
        QModelIndex index = model.index(row, 0, QModelIndex());
        model.setData(index, QVariant((row+1)*10));
    }
    tableView.setModel(&model);

    QItemSelectionModel *selectionModel = tableView.selectionModel();
    QObject::connect(selectionModel, &QItemSelectionModel::currentRowChanged,
                     onCurrentRowChanged);

    tableView.show();
    return app.exec();
}

运行结果:

1.窗口 

2.控制台 

当前行变为: 0 之前选中的行是: -1
当前行变为: 1 之前选中的行是: 0
当前行变为: 2 之前选中的行是: 1
当前行变为: 3 之前选中的行是: 2 

在这个示例中,我们创建了一个简单的 QTableView 和一个 QStandardItemModel,并填充了一些数据。然后,我们连接了 currentRowChanged 信号到 onCurrentRowChanged 槽函数,这样当用户改变选择时,就会在控制台输出当前行和之前选中的行的信息。

5.QItemSelectionModel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值