#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "adddialog.h"
#include <QMenu>
#include <QAction>
#include <QCursor>
#include <QMessageBox>
#include <QPushButton>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, dataManager(DataManager::getInstance())
{
ui->setupUi(this);
initTreeWidget();
initTableWidget();
connect(ui->treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)),
this, SLOT(onTreeItemClicked(QTreeWidgetItem*, int)));
connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),
this,SLOT(ContextMenuRequested(QPoint)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initTreeWidget()
{
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
ui->treeWidget->setHeaderLabel("学生管理系统");
QTreeWidgetItem *uitem=new QTreeWidgetItem();
uitem->setText(0,"北京大学");
uitem->setData(0, Qt::UserRole, 0);
ui->treeWidget->addTopLevelItem(uitem);
QTreeWidgetItem *citem=new QTreeWidgetItem();
citem->setText(0,"计算机学院");
citem->setData(0, Qt::UserRole, 1);
uitem->addChild(citem);
QTreeWidgetItem *titem=new QTreeWidgetItem();
titem->setText(0,"老师");
titem->setData(0, Qt::UserRole, 2);
citem->addChild(titem);
QTreeWidgetItem *sitem=new QTreeWidgetItem();
sitem->setText(0,"学生");
sitem->setData(0, Qt::UserRole, 3);
citem->addChild(sitem);
QTreeWidgetItem *titem1=new QTreeWidgetItem();
titem1->setText(0,"闻清砚");
titem1->setData(0, Qt::UserRole, 4);
titem->addChild(titem1);
QTreeWidgetItem *sitem1=new QTreeWidgetItem();
sitem1->setText(0,"司南钰");
sitem1->setData(0, Qt::UserRole, 5);
sitem->addChild(sitem1 );
ui->treeWidget->expandAll();
}
void MainWindow::initTableWidget()
{
QStringList headers = {"类型", "ID", "姓名", "年龄", "身高"};
ui->tableWidget->setColumnCount(headers.size());
ui->tableWidget->setHorizontalHeaderLabels(headers);
}
void MainWindow::ContextMenuRequested(QPoint pos)
{
if(ui->treeWidget->itemAt(pos) == nullptr)
{
//当点击的位置没有条目
//显示菜单
QMenu menu;
QAction *addact = new QAction;
addact->setText("add University");
menu.addAction(addact);
connect(addact,SIGNAL(triggered(bool)),
this,SLOT(addUniversity()));
QAction *removeact = new QAction;
removeact->setText("remove all");
menu.addAction(removeact);
connect(removeact,SIGNAL(triggered(bool)),
this,SLOT(removeAll()));
menu.exec(QCursor::pos());
}else
{
//当点击的位置有条目
QMenu menu;
if(ui->treeWidget->currentItem()->data(0,Qt::UserRole) == 0)
{
QAction *addact = new QAction;
addact->setText("add Collage");
menu.addAction(addact);
connect(addact,SIGNAL(triggered(bool)),
this,SLOT(addCollage()));
menu.exec(QCursor::pos());
}
else if(ui->treeWidget->currentItem()->data(0,Qt::UserRole) == 1)
{
QAction *stuaddact = new QAction;
stuaddact->setText("add student");
menu.addAction(stuaddact);
connect(stuaddact,SIGNAL(triggered(bool)),this,SLOT(addStudent()));
QAction *teaaddact = new QAction;
teaaddact->setText("add teacher");
menu.addAction(teaaddact);
connect(teaaddact,SIGNAL(triggered(bool)),this,SLOT(addTeacher()));
QAction *removeact = new QAction;
removeact->setText("remove Collage");
menu.addAction(removeact);
connect(removeact,SIGNAL(triggered(bool)),this,SLOT(removeCollage()));
menu.exec(QCursor::pos());
}
else if(ui->treeWidget->currentItem()->data(0,Qt::UserRole) == 2)
{
QAction *teaaddact = new QAction;
teaaddact->setText("add teachername");
menu.addAction(teaaddact);
connect(teaaddact,SIGNAL(triggered(bool)),this,SLOT(addTeacherName()));
QAction *removeact = new QAction;
removeact->setText("remove Teacher");
menu.addAction(removeact);
connect(removeact,SIGNAL(triggered(bool)),
this,SLOT(removeTeacher()));
menu.exec(QCursor::pos());
}
else if(ui->treeWidget->currentItem()->data(0,Qt::UserRole) == 3)
{
QAction *stuaddact = new QAction;
stuaddact->setText("add studentname");
menu.addAction(stuaddact);
connect(stuaddact,SIGNAL(triggered(bool)),this,SLOT(addStudentName()));
QAction *removeact = new QAction;
removeact->setText("remove Student");
menu.addAction(removeact);
connect(removeact,SIGNAL(triggered(bool)),
this,SLOT(removeStudent()));
menu.exec(QCursor::pos());
}
else if(ui->treeWidget->currentItem()->data(0,Qt::UserRole) == 4)
{
QAction *removeact = new QAction;
removeact->setText("remove TeacherName");
menu.addAction(removeact);
connect(removeact,SIGNAL(triggered(bool)),
this,SLOT(removeTeacherName()));
menu.exec(QCursor::pos());
}
else if(ui->treeWidget->currentItem()->data(0,Qt::UserRole) == 5)
{
QAction *removeact = new QAction;
removeact->setText("remove StudentName");
menu.addAction(removeact);
connect(removeact,SIGNAL(triggered(bool)),
this,SLOT(removeStudentName()));
menu.exec(QCursor::pos());
}
if (!menu.actions().isEmpty()) {
menu.exec(ui->treeWidget->mapToGlobal(pos));
}
}
}
void MainWindow::addUniversity()
{
//添加根节点
QTreeWidgetItem *uitem = new QTreeWidgetItem;
//设置隐藏属性
uitem->setData(0,Qt::UserRole,0);
uitem->setText(0,"学校");
ui->treeWidget->addTopLevelItem(uitem);
}
*/
void MainWindow::addCollage()
{
/*//1.找到当前节点
QTreeWidgetItem*cur = ui->treeWidget->currentItem();
QTreeWidgetItem *child = new QTreeWidgetItem;
child->setData(0,Qt::UserRole,1);
child->setText(0,"学院");
cur->addChild(child);
cur->setExpanded(true); // 自动展开父节点
*/
AddDialog dialog(AddDialog::College, this);
if (dialog.exec() == QDialog::Accepted) {
QString cid = dialog.getText1();
QString cname = dialog.getText2();
if (cid.isEmpty() || cname.isEmpty()) return;
QSqlQuery query;
query.prepare("INSERT INTO College (cid, cname, uid) VALUES (?, ?, ?)");
query.addBindValue(cid);
query.addBindValue(cname);
query.addBindValue(dataManager->getUniversityUid());
if (query.exec()) {
QTreeWidgetItem *cur = ui->treeWidget->currentItem();
QTreeWidgetItem *child = new QTreeWidgetItem();
child->setText(0, cname);
child->setData(0, Qt::UserRole, 1); // 类型为学院
cur->addChild(child);
cur->setExpanded(true);
} else {
QMessageBox::warning(this, "错误", "无法添加学院:" + query.lastError().text());
}
}
}
void MainWindow::addTeacher()
{
//1.找到当前节点
QTreeWidgetItem*cur = ui->treeWidget->currentItem();
QTreeWidgetItem *child = new QTreeWidgetItem;
child->setData(0,Qt::UserRole,2);
child->setText(0,"老师");
cur->addChild(child);
cur->setExpanded(true);
}
void MainWindow::addStudent()
{
//1.找到当前节点
QTreeWidgetItem*cur = ui->treeWidget->currentItem();
QTreeWidgetItem *child = new QTreeWidgetItem;
child->setData(0,Qt::UserRole,3);
child->setText(0,"学生");
cur->addChild(child);
cur->setExpanded(true); // 自动展开父节点
}
void MainWindow::removeAll()
{
//删除所有节点
ui->treeWidget->clear();
}
void MainWindow::removeCollage()
{
QTreeWidgetItem * paret = ui->treeWidget->currentItem()->parent();
paret->takeChild(ui->treeWidget->currentIndex().row());
}
void MainWindow::addTeacherName()
{
//1.找到当前节点
QTreeWidgetItem*cur = ui->treeWidget->currentItem();
QTreeWidgetItem *child = new QTreeWidgetItem;
child->setData(0,Qt::UserRole,4);
child->setText(0,"老师1");
cur->addChild(child);
cur->setExpanded(true);
}
void MainWindow::addStudentName()
{
//1.找到当前节点
QTreeWidgetItem*cur = ui->treeWidget->currentItem();
QTreeWidgetItem *child = new QTreeWidgetItem;
child->setData(0,Qt::UserRole,5);
child->setText(0,"学生1");
cur->addChild(child);
cur->setExpanded(true);
}
void MainWindow::removeTeacher()
{
QTreeWidgetItem * parent = ui->treeWidget->currentItem()->parent();
parent->takeChild(ui->treeWidget->currentIndex().row());
}
void MainWindow::removeStudent()
{
QTreeWidgetItem * parent = ui->treeWidget->currentItem()->parent();
parent->takeChild(ui->treeWidget->currentIndex().row());
}
void MainWindow::removeTeacherName()
{
//QTreeWidgetItem * parent = ui->treeWidget->currentItem()->parent();
// parent->takeChild(ui->treeWidget->currentIndex().row());
QTreeWidgetItem *item = ui->treeWidget->currentItem();
if (!item || item->data(0, Qt::UserRole).toInt() != 4) return;
QString name = item->text(0);
QSqlQuery q;
q.prepare("DELETE FROM Teacher WHERE name = ?");
q.addBindValue(name);
if (q.exec()) {
delete item; // 成功则删除 UI 节点
} else {
QMessageBox::warning(this, "删除失败", q.lastError().text());
}
}
void MainWindow::removeStudentName()
{
//QTreeWidgetItem * parent = ui->treeWidget->currentItem()->parent();
//parent->takeChild(ui->treeWidget->currentIndex().row());
QTreeWidgetItem *item = ui->treeWidget->currentItem();
if (!item || item->data(0, Qt::UserRole).toInt() != 5) return;
QString name = item->text(0);
QSqlQuery q;
q.prepare("DELETE FROM Teacher WHERE name = ?");
q.addBindValue(name);
if (q.exec()) {
delete item; // 成功则删除 UI 节点
} else {
QMessageBox::warning(this, "删除失败", q.lastError().text());
}
}
void MainWindow::onTreeItemClicked(QTreeWidgetItem *item, int column)
{
Q_UNUSED(column)
if (!item) return;
int role = item->data(0, Qt::UserRole).toInt();
QString text = item->text(0);
switch (role) {
case 0:
showUniversityInfo();
break;
case 1:
showCollegeInfo(item);
break;
case 4:
showTeacherInfo(text);
break;
case 5:
showStudentInfo(text);
break;
/*case 2: {
// 展开该学院的所有老师
updateTeacherGroup(item->parent());
break;
}
case 3: {
// 展开该学院的所有学生
updateStudentGroup(item->parent());
break;
}
*/
}
}
void MainWindow::showUniversityInfo()
{
//ui->tableWidget->clear();
QStringList headers = {"大学ID", "大学名称", "地址"};
ui->tableWidget->setColumnCount(3);
ui->tableWidget->setHorizontalHeaderLabels(headers);
ui->tableWidget->setRowCount(1);
ui->tableWidget->setItem(0, 0, new QTableWidgetItem(dataManager->getUniversityUid()));
ui->tableWidget->setItem(0, 1, new QTableWidgetItem(dataManager->getUniversityUname()));
ui->tableWidget->setItem(0, 2, new QTableWidgetItem(dataManager->getUniversityUaddr()));
}
void MainWindow::showCollegeInfo(QTreeWidgetItem *item)
{
QString cid = item->text(0); // 实际应从父级获取 ID
const Collage* c = dataManager->getCollegeById(cid);
if (!c) return;
ui->tableWidget->clearContents();
ui->tableWidget->setRowCount(1);
ui->tableWidget->setItem(0, 0, new QTableWidgetItem("学院"));
ui->tableWidget->setItem(0, 1, new QTableWidgetItem(QString::fromStdString(c->cid())));
ui->tableWidget->setItem(0, 2, new QTableWidgetItem(QString::fromStdString(c->cname())));
}
void MainWindow::showTeacherInfo(const QString& name)
{
const Teacher* t = nullptr;
auto uni = University::getInstance();
for (const auto& c : uni->c_list) {
for (const auto& teacher : c->t_list) {
if (QString::fromStdString(teacher->name()) == name) {
t = teacher;
break;
}
}
if (t) break;
}
if (!t) return;
ui->tableWidget->clearContents();
ui->tableWidget->setRowCount(1);
ui->tableWidget->setItem(0, 0, new QTableWidgetItem("教师"));
ui->tableWidget->setItem(0, 1, new QTableWidgetItem(QString::fromStdString(t->tid())));
ui->tableWidget->setItem(0, 2, new QTableWidgetItem(QString::fromStdString(t->name())));
ui->tableWidget->setItem(0, 3, new QTableWidgetItem(QString::number(t->age())));
ui->tableWidget->setItem(0, 4, new QTableWidgetItem(QString::number(t->height())));
}
void MainWindow::showStudentInfo(const QString& name)
{
const Student* s = nullptr;
auto uni = University::getInstance();
for (const auto& c : uni->c_list) {
for (const auto& student : c->s_list) {
if (QString::fromStdString(student->name()) == name) {
s = student;
break;
}
}
if (s) break;
}
if (!s) return;
ui->tableWidget->clearContents();
ui->tableWidget->setRowCount(1);
ui->tableWidget->setItem(0, 0, new QTableWidgetItem("学生"));
ui->tableWidget->setItem(0, 1, new QTableWidgetItem(QString::fromStdString(s->sid())));
ui->tableWidget->setItem(0, 2, new QTableWidgetItem(QString::fromStdString(s->name())));
ui->tableWidget->setItem(0, 3, new QTableWidgetItem(QString::number(s->age())));
ui->tableWidget->setItem(0, 4, new QTableWidgetItem(QString::number(s->height())));
}
在原代码中略微修改
最新发布