QTableView 删除选中的行

1.概要

在 Qt 中使用 QTableView 时,你可以通过以下步骤删除选中的行。假设你有一个 QTableView 和一个相应的模型(如 QStandardItemModel)。以下是一个简单的示例,展示如何删除选中的行:

  1. 获取选中的行索引。
  2. 从模型中删除这些行。

2.代码

1.工程

cmake_minimum_required(VERSION 3.5)

project(untitled13 VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

set(PROJECT_SOURCES
        main.cpp



)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(untitled13
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
        MyWindow.h
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET untitled13 APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(untitled13 SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(untitled13
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(untitled13 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
  set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.untitled13)
endif()
set_target_properties(untitled13 PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

include(GNUInstallDirs)
install(TARGETS untitled13
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(untitled13)
endif()

2.类文件

#ifndef MYWINDOW_H
#define MYWINDOW_H
#include <QTableView>
#include <QStandardItemModel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>

class MyWindow : public QWidget {
    Q_OBJECT

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

        // 创建 QTableView 和 QStandardItemModel
        tableView = new QTableView(this);
        model = new QStandardItemModel(5, 3, this); // 5 行 3 列

        // 设置一些示例数据
        for (int row = 0; row < 5; ++row) {
            for (int col = 0; col < 3; ++col) {
                model->setItem(row, col, new QStandardItem(QString("Item %1%2").arg(row).arg(col)));
            }
        }

        tableView->setModel(model);

        // 创建一个按钮来触发删除操作
        QPushButton *deleteButton = new QPushButton("Delete Selected Rows", this);
        connect(deleteButton, &QPushButton::clicked, this, &MyWindow::deleteSelectedRows);

        layout->addWidget(tableView);
        layout->addWidget(deleteButton);
    }

private slots:
    void deleteSelectedRows() {
        // 获取选中的索引
        QModelIndexList selectedIndexes = tableView->selectionModel()->selectedRows();

        // 从模型中删除选中的行(从后往前删除)
        for (int i = selectedIndexes.size() - 1; i >= 0; --i) {
            model->removeRow(selectedIndexes[i].row());
        }
    }

private:
    QTableView *tableView;
    QStandardItemModel *model;
};

#endif // MYWINDOW_H

解释

  1. 创建模型和视图
    • QTableView 用于显示数据。
    • QStandardItemModel 用于存储和管理数据。
  2. 填充模型
    • 用一些示例数据填充模型。
  3. 获取选中的行
    • 使用 tableView->selectionModel()->selectedRows() 获取所有选中的行索引。
  4. 删除选中的行
    • 从后往前遍历选中的行索引,并从模型中删除对应的行。
  5. UI 布局
    • 使用 QVBoxLayout 来组织 QTableView 和 QPushButton 的布局。
  6. 信号和槽
    • 连接按钮的 clicked 信号到自定义的槽 deleteSelectedRows,在该槽中执行删除操作。

运行这个示例,你可以选中一行或多行,然后点击 "Delete Selected Rows" 按钮来删除选中的行。

3.入口函数

#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
#include "MyWindow.h"



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

    MyWindow window;
    window.show();

    return app.exec();
}

3.运行结果

删除前

 删除后

视频效果

QTableView删除选择的条目

猜你喜欢

转载自blog.csdn.net/xie__jin__cheng/article/details/143436029