1.概要
在 Qt 中使用 QTableView
时,你可以通过以下步骤删除选中的行。假设你有一个 QTableView
和一个相应的模型(如 QStandardItemModel
)。以下是一个简单的示例,展示如何删除选中的行:
- 获取选中的行索引。
- 从模型中删除这些行。
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
解释
- 创建模型和视图:
QTableView
用于显示数据。QStandardItemModel
用于存储和管理数据。
- 填充模型:
- 用一些示例数据填充模型。
- 获取选中的行:
- 使用
tableView->selectionModel()->selectedRows()
获取所有选中的行索引。
- 使用
- 删除选中的行:
- 从后往前遍历选中的行索引,并从模型中删除对应的行。
- UI 布局:
- 使用
QVBoxLayout
来组织QTableView
和QPushButton
的布局。
- 使用
- 信号和槽:
- 连接按钮的
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删除选择的条目