-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsitemanagerdialog.cpp
More file actions
155 lines (125 loc) · 5.69 KB
/
sitemanagerdialog.cpp
File metadata and controls
155 lines (125 loc) · 5.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include "sitemanagerdialog.h"
#include "ui_sitemanagerdialog.h"
#include <QMessageBox>
#include <QPushButton>
SiteManagerDialog::SiteManagerDialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::SiteManagerDialog)
{
ui->setupUi(this);
siteModel = new QStandardItemModel(this);
ui->siteTree->setModel(siteModel);
siteModel->setHorizontalHeaderLabels({"选择项(S)"});
loadSites(); // 在对话框启动时加载所有已存站点
connect(ui->siteTree, &QTreeView::clicked, this, &SiteManagerDialog::on_siteTree_clicked);
// 动态地向底部的按钮栏添加我们自定义的“连接”按钮
QPushButton *connectButton = ui->buttonBox->addButton("连接(C)", QDialogButtonBox::ActionRole);
// 将新按钮的 clicked 信号连接到一个新的槽函数 onConnectButtonClicked
connect(connectButton, &QPushButton::clicked, this, &SiteManagerDialog::onConnectButtonClicked);
}
SiteManagerDialog::~SiteManagerDialog()
{
delete ui;
}
void SiteManagerDialog::loadSites()
{
siteModel->clear(); // 先清空现有列表
QSettings settings("MyCompany", "MyFileZilla"); // 参数1:公司名, 参数2:应用名
settings.beginGroup("Sites"); // 进入名为 "Sites" 的分组
QStringList siteNames = settings.childGroups(); // 获取 "Sites" 下所有的子分组名
for (const QString &siteName : siteNames) {
QStandardItem *item = new QStandardItem(siteName);
item->setEditable(false);
// 关键:将站点的所有数据作为一个QVariantMap,附加到item上
QVariantMap siteData;
siteData["host"] = settings.value(siteName + "/host");
siteData["port"] = settings.value(siteName + "/port");
siteData["user"] = settings.value(siteName + "/user");
siteData["pass"] = settings.value(siteName + "/pass"); // 真实项目中密码应加密
item->setData(siteData, Qt::UserRole);
siteModel->appendRow(item);
}
settings.endGroup();
}
void SiteManagerDialog::on_siteTree_clicked(const QModelIndex &index)
{
if (!index.isValid()) return;
// 从被点击的item中,取出我们之前附加的siteData
QVariantMap siteData = siteModel->itemFromIndex(index)->data(Qt::UserRole).toMap();
// 用取出的数据填充右侧的输入框
ui->hostEdit->setText(siteData.value("host").toString());
ui->portEdit->setText(siteData.value("port").toString());
ui->userEdit->setText(siteData.value("user").toString());
ui->passEdit->setText(siteData.value("pass").toString());
}
void SiteManagerDialog::on_newSiteButton_clicked()
{
QStandardItem *item = new QStandardItem("新站点");
item->setEditable(true); // 允许用户重命名
siteModel->appendRow(item); // 添加到模型中
// 选中新创建的项,并立即进入编辑模式让用户修改名称
ui->siteTree->setCurrentIndex(item->index());
ui->siteTree->edit(item->index());
}
void SiteManagerDialog::on_deleteButton_clicked()
{
QModelIndex currentIndex = ui->siteTree->currentIndex();
if (!currentIndex.isValid()) {
return; // 如果没有选中项,则不执行任何操作
}
if (QMessageBox::question(this, "确认删除", "您确定要删除选中的站点吗?") == QMessageBox::Yes) {
siteModel->removeRow(currentIndex.row());
}
}
//当用户点击OK按钮时,将当前列表中的所有站点信息,以及用户在 右侧输入框中做的任何修改,都保存到QSettings中。
void SiteManagerDialog::saveSites()
{
QSettings settings("MyCompany", "MyFileZilla");
settings.remove("Sites"); // 先清空旧的所有站点信息,准备全新写入
settings.beginGroup("Sites");
// 遍历模型中的所有站点
for (int i = 0; i < siteModel->rowCount(); ++i) {
QStandardItem *item = siteModel->item(i);
QString siteName = item->text();
QVariantMap siteData = item->data(Qt::UserRole).toMap();
// 将每个站点的详细数据写入配置文件
settings.setValue(siteName + "/host", siteData.value("host"));
settings.setValue(siteName + "/port", siteData.value("port"));
settings.setValue(siteName + "/user", siteData.value("user"));
settings.setValue(siteName + "/pass", siteData.value("pass"));
}
settings.endGroup();
}
void SiteManagerDialog::accept()
{
// 在关闭对话框前,需要将当前右侧编辑栏的数据,保存到当前选中的item中
QModelIndex currentIndex = ui->siteTree->currentIndex();
if (currentIndex.isValid()) {
QVariantMap siteData;
siteData["host"] = ui->hostEdit->text();
siteData["port"] = ui->portEdit->text();
siteData["user"] = ui->userEdit->text();
siteData["pass"] = ui->passEdit->text();
siteModel->itemFromIndex(currentIndex)->setData(siteData, Qt::UserRole);
}
saveSites(); // 调用保存函数,将所有数据写入配置文件
QDialog::accept(); // 调用基类的 accept() 函数,关闭对话框
}
void SiteManagerDialog::onConnectButtonClicked()
{
QModelIndex currentIndex = ui->siteTree->currentIndex();
if (!currentIndex.isValid()) {
QMessageBox::warning(this, "提示", "请先在左侧选择一个要连接的站点。");
return;
}
// 1. 从右侧输入框收集当前最新的连接信息
QVariantMap siteData;
siteData["host"] = ui->hostEdit->text();
siteData["port"] = ui->portEdit->text().toInt();
siteData["user"] = ui->userEdit->text();
siteData["pass"] = ui->passEdit->text();
// 2. 发射信号,将打包好的连接信息广播出去
emit connectSiteRequested(siteData);
// 3. 调用我们之前写好的 accept(),顺便保存所有更改并关闭对话框
accept();
}