Qt项目锻炼——TODO清单(三)

发布于:2025-07-06 ⋅ 阅读:(12) ⋅ 点赞:(0)

创建主窗口 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_OBJECT

public:
    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_OBJECT

public:
    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);
    }
}

我先创建对应的槽函数,为后面按键信号与槽链接做准备。


网站公告

今日签到

点亮在社区的每一天
去签到