Qt项目锻炼——TODO清单(三)
创建主窗口 MainWindow,添加 QTableView 显示任务
步骤
- 创建 MainWindow 类,继承自 QMainWindow。
- 在 MainWindow 的构造函数中,创建 TaskModel 和 QTableView,并将 TaskModel 设置为 QTableView 的模型。
头文件
#pragma once#include <QtWidgets/QMainWindow>
#include "ui_MainWindow.h"
#include"Task.h"
#include<qtableview.h>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindowClass ui;QTableView* taskTableView; TaskModel* taskModel;
};
为什么成员变量不使用智能指针,因为Qt有自己的一套资源回收机制,通过指定父窗口实现当父窗口销毁时,子窗口一同销毁。
源文件
#include "MainWindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);taskModel = new TaskModel(this);taskTableView = new QTableView(this);taskTableView->setModel(taskModel);setCentralWidget(taskTableView);
}MainWindow::~MainWindow()
{}
实现任务的增删改查功能
步骤
- 在 MainWindow 中添加按钮用于添加、删除、修改和查询任务。
- 连接按钮的点击信号到相应的槽函数,在槽函数中调用 TaskModel 的方法实现任务的增删改查。
头文件
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_addButton_clicked();void on_deleteButton_clicked();void on_updateButton_clicked();void on_searchButton_clicked();private:Ui::MainWindowClass ui;QTableView* taskTableView; TaskModel* taskModel;
};
源文件
void MainWindow::on_addButton_clicked()
{bool ok;QString title = QInputDialog::getText(this, "Add Task", "Title:", QLineEdit::Normal, "", &ok);if (ok && !title.isEmpty()){Task task(-1, title, "", Task::Medium, QDate(), false);if (taskModel->addTask(task)){QMessageBox::information(this, "Success", "Task added successfully.");}else{QMessageBox::critical(this, "Error", "Failed to add task.");}}
}void MainWindow::on_deleteButton_clicked()
{QModelIndexList selectedRows = taskTableView->selectionModel()->selectedRows();if (!selectedRows.isEmpty()){int taskId = taskModel->data(taskModel->index(selectedRows.first().row(), TaskModel::IdColumn)).toInt();if (taskModel->deleteTask(taskId)){QMessageBox::information(this, "Success", "Task deleted successfully.");}else{QMessageBox::critical(this, "Error", "Failed to delete task.");}}
}void MainWindow::on_updateButton_clicked()
{QModelIndexList selectedRows = taskTableView->selectionModel()->selectedRows();if (!selectedRows.isEmpty()){int taskId = taskModel->data(taskModel->index(selectedRows.first().row(), TaskModel::IdColumn)).toInt();bool ok;QString title = QInputDialog::getText(this, "Update Task", "Title:", QLineEdit::Normal,taskModel->data(taskModel->index(selectedRows.first().row(), TaskModel::TitleColumn)).toString(), &ok);if (ok && !title.isEmpty()){Task task(taskId, title, "", Task::Medium, QDate(), false);if (taskModel->updateTask(task)){QMessageBox::information(this, "Success", "Task updated successfully.");}else{QMessageBox::critical(this, "Error", "Failed to update task.");}}}
}void MainWindow::on_searchButton_clicked()
{bool ok;QString searchText = QInputDialog::getText(this, "Search Task", "Search:", QLineEdit::Normal, "", &ok);if (ok){taskModel->setSearchText(searchText);}
}我先创建对应的槽函数,为后面按键信号与槽链接做准备。