| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468 |
- #include "createmeetingdialog.h"
- #include <QCloseEvent>
- #include <QEventLoop>
- #include <QMessageBox>
- #include <QRandomGenerator>
- #include <QRegularExpression>
- #include <QRegularExpressionValidator>
- #include <QScrollArea>
- CreateMeetingDialog::CreateMeetingDialog(QWidget *parent)
- : TDialog(parent)
- , m_mainLayout(nullptr)
- , m_formLayout(nullptr)
- , m_basicGroup(nullptr)
- , m_basicLayout(nullptr)
- , m_meetingNameEdit(nullptr)
- , m_descriptionEdit(nullptr)
- , m_startTimeEdit(nullptr)
- , m_durationSpinBox(nullptr)
- , m_maxParticipantsSpinBox(nullptr)
- , m_meetingTypeCombo(nullptr)
- , m_securityGroup(nullptr)
- , m_securityLayout(nullptr)
- , m_passwordCheckBox(nullptr)
- , m_passwordLayout(nullptr)
- , m_passwordEdit(nullptr)
- , m_generatePasswordButton(nullptr)
- , m_recordCheckBox(nullptr)
- , m_roleGroup(nullptr)
- , m_roleLayout(nullptr)
- , m_joinAsAdminCheckBox(nullptr)
- , m_buttonLayout(nullptr)
- , m_createButton(nullptr)
- , m_cancelButton(nullptr)
- {
- setWindowTitle("创建会议");
- resize(500, 600);
- setupUI();
- applyStyles();
- setDefaultValues();
- // 初始状态下禁用创建按钮
- m_createButton->setEnabled(false);
- }
- CreateMeetingDialog::~CreateMeetingDialog() {}
- void CreateMeetingDialog::setupUI()
- {
- // 创建滚动区域
- QScrollArea *scrollArea = new QScrollArea();
- scrollArea->setWidgetResizable(true);
- scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- QWidget *scrollWidget = new QWidget();
- scrollArea->setWidget(scrollWidget);
- m_mainLayout = new QVBoxLayout(scrollWidget);
- m_mainLayout->setContentsMargins(20, 20, 20, 20);
- m_mainLayout->setSpacing(20);
- // 基本信息组
- m_basicGroup = new QGroupBox("基本信息", scrollWidget);
- m_basicLayout = new QFormLayout(m_basicGroup);
- m_basicLayout->setContentsMargins(15, 15, 15, 15);
- m_basicLayout->setSpacing(10);
- // 会议名称
- m_meetingNameEdit = new QLineEdit();
- m_meetingNameEdit->setPlaceholderText("请输入会议名称");
- connect(m_meetingNameEdit,
- &QLineEdit::textChanged,
- this,
- &CreateMeetingDialog::onMeetingNameChanged);
- m_basicLayout->addRow("会议名称 *:", m_meetingNameEdit);
- // 会议描述
- m_descriptionEdit = new QTextEdit();
- m_descriptionEdit->setPlaceholderText("请输入会议描述(可选)");
- m_descriptionEdit->setMaximumHeight(80);
- m_basicLayout->addRow("会议描述:", m_descriptionEdit);
- // 开始时间
- m_startTimeEdit = new QDateTimeEdit();
- m_startTimeEdit->setCalendarPopup(true);
- m_startTimeEdit->setDisplayFormat("yyyy-MM-dd hh:mm");
- m_basicLayout->addRow("开始时间 *:", m_startTimeEdit);
- // 会议时长
- m_durationSpinBox = new QSpinBox();
- m_durationSpinBox->setRange(15, 480); // 15分钟到8小时
- m_durationSpinBox->setSuffix(" 分钟");
- m_durationSpinBox->setSingleStep(15);
- m_basicLayout->addRow("会议时长 *:", m_durationSpinBox);
- // 最大参与人数
- m_maxParticipantsSpinBox = new QSpinBox();
- m_maxParticipantsSpinBox->setRange(2, 100);
- m_maxParticipantsSpinBox->setSuffix(" 人");
- m_basicLayout->addRow("最大参与人数:", m_maxParticipantsSpinBox);
- // 会议类型
- m_meetingTypeCombo = new QComboBox();
- m_meetingTypeCombo->addItems({"视频会议", "音频会议", "屏幕共享", "网络研讨会"});
- m_basicLayout->addRow("会议类型:", m_meetingTypeCombo);
- m_mainLayout->addWidget(m_basicGroup);
- // 安全设置组
- m_securityGroup = new QGroupBox("安全设置", scrollWidget);
- m_securityLayout = new QVBoxLayout(m_securityGroup);
- m_securityLayout->setContentsMargins(15, 15, 15, 15);
- m_securityLayout->setSpacing(10);
- // 密码设置
- m_passwordCheckBox = new QCheckBox("启用会议密码");
- connect(m_passwordCheckBox,
- &QCheckBox::toggled,
- this,
- &CreateMeetingDialog::onPasswordCheckChanged);
- m_securityLayout->addWidget(m_passwordCheckBox);
- m_passwordLayout = new QHBoxLayout();
- m_passwordEdit = new QLineEdit();
- m_passwordEdit->setPlaceholderText("请输入6-12位密码");
- m_passwordEdit->setMaxLength(12);
- m_passwordEdit->setEnabled(false);
- // 设置密码验证器
- QRegularExpression passwordRegex("[A-Za-z0-9]{6,12}");
- QRegularExpressionValidator *passwordValidator = new QRegularExpressionValidator(passwordRegex,
- this);
- m_passwordEdit->setValidator(passwordValidator);
- m_generatePasswordButton = new QPushButton("生成密码");
- m_generatePasswordButton->setEnabled(false);
- connect(m_generatePasswordButton,
- &QPushButton::clicked,
- this,
- &CreateMeetingDialog::generateRandomPassword);
- m_passwordLayout->addWidget(m_passwordEdit);
- m_passwordLayout->addWidget(m_generatePasswordButton);
- m_securityLayout->addLayout(m_passwordLayout);
- // 录制设置
- m_recordCheckBox = new QCheckBox("自动录制会议");
- m_securityLayout->addWidget(m_recordCheckBox);
- m_mainLayout->addWidget(m_securityGroup);
- // 角色选择组
- m_roleGroup = new QGroupBox("加入方式", scrollWidget);
- m_roleLayout = new QVBoxLayout(m_roleGroup);
- m_roleLayout->setContentsMargins(15, 15, 15, 15);
- m_roleLayout->setSpacing(10);
- m_joinAsAdminCheckBox = new QCheckBox("以管理员身份加入会议(可以录制和管理)");
- m_joinAsAdminCheckBox->setChecked(true); // 默认选中管理员模式
- m_roleLayout->addWidget(m_joinAsAdminCheckBox);
- QLabel *roleHint = new QLabel("提示:取消勾选将以观看者身份加入会议");
- roleHint->setStyleSheet("color: #666; font-size: 12px;");
- m_roleLayout->addWidget(roleHint);
- m_mainLayout->addWidget(m_roleGroup);
- // 按钮布局
- m_buttonLayout = new QHBoxLayout();
- m_buttonLayout->addStretch();
- m_cancelButton = new QPushButton("取消");
- m_createButton = new QPushButton("创建会议");
- connect(m_cancelButton, &QPushButton::clicked, this, &CreateMeetingDialog::reject);
- connect(m_createButton, &QPushButton::clicked, this, &CreateMeetingDialog::accept);
- m_buttonLayout->addWidget(m_cancelButton);
- m_buttonLayout->addWidget(m_createButton);
- m_mainLayout->addLayout(m_buttonLayout);
- // 设置主布局 - 使用TWidget的mainLayout()
- mainLayout()->addWidget(scrollArea);
- }
- void CreateMeetingDialog::applyStyles()
- {
- setStyleSheet("CreateMeetingDialog {"
- " background-color: #f8f9fa;"
- "}"
- "QScrollArea {"
- " border: none;"
- " background-color: #f8f9fa;"
- "}"
- "QGroupBox {"
- " font-size: 14px;"
- " font-weight: bold;"
- " color: #495057;"
- " border: 2px solid #e9ecef;"
- " border-radius: 8px;"
- " margin-top: 10px;"
- " background-color: white;"
- "}"
- "QGroupBox::title {"
- " subcontrol-origin: margin;"
- " left: 10px;"
- " padding: 0 8px 0 8px;"
- " background-color: white;"
- "}"
- "QLabel {"
- " font-size: 13px;"
- " color: #495057;"
- " font-weight: 500;"
- "}"
- "QLineEdit {"
- " border: 2px solid #e9ecef;"
- " border-radius: 6px;"
- " padding: 8px 12px;"
- " font-size: 13px;"
- " background-color: white;"
- "}"
- "QLineEdit:focus {"
- " border-color: #007bff;"
- " outline: none;"
- "}"
- "QLineEdit:disabled {"
- " background-color: #f8f9fa;"
- " color: #6c757d;"
- "}"
- "QTextEdit {"
- " border: 2px solid #e9ecef;"
- " border-radius: 6px;"
- " padding: 8px 12px;"
- " font-size: 13px;"
- " background-color: white;"
- "}"
- "QTextEdit:focus {"
- " border-color: #007bff;"
- " outline: none;"
- "}"
- "QDateTimeEdit, QSpinBox, QComboBox {"
- " border: 2px solid #e9ecef;"
- " border-radius: 6px;"
- " padding: 8px 12px;"
- " font-size: 13px;"
- " background-color: white;"
- "}"
- "QDateTimeEdit:focus, QSpinBox:focus, QComboBox:focus {"
- " border-color: #007bff;"
- " outline: none;"
- "}"
- "QCheckBox {"
- " font-size: 13px;"
- " color: #495057;"
- " spacing: 8px;"
- "}"
- "QCheckBox::indicator {"
- " width: 16px;"
- " height: 16px;"
- " border: 2px solid #e9ecef;"
- " border-radius: 3px;"
- " background-color: white;"
- "}"
- "QCheckBox::indicator:checked {"
- " background-color: #007bff;"
- " border-color: #007bff;"
- " image: url(:/icons/check.png);"
- "}"
- "QPushButton {"
- " border: none;"
- " border-radius: 6px;"
- " padding: 10px 20px;"
- " font-size: 13px;"
- " font-weight: 500;"
- " min-width: 80px;"
- "}"
- "#createButton {"
- " background-color: #28a745;"
- " color: white;"
- "}"
- "#createButton:hover {"
- " background-color: #218838;"
- "}"
- "#createButton:pressed {"
- " background-color: #1e7e34;"
- "}"
- "#createButton:disabled {"
- " background-color: #6c757d;"
- " color: #adb5bd;"
- "}"
- "#cancelButton {"
- " background-color: #6c757d;"
- " color: white;"
- "}"
- "#cancelButton:hover {"
- " background-color: #545b62;"
- "}"
- "#generatePasswordButton {"
- " background-color: #17a2b8;"
- " color: white;"
- " min-width: 60px;"
- "}"
- "#generatePasswordButton:hover {"
- " background-color: #138496;"
- "}"
- "#generatePasswordButton:disabled {"
- " background-color: #6c757d;"
- " color: #adb5bd;"
- "}");
- m_createButton->setObjectName("createButton");
- m_cancelButton->setObjectName("cancelButton");
- m_generatePasswordButton->setObjectName("generatePasswordButton");
- }
- void CreateMeetingDialog::setDefaultValues()
- {
- // 设置默认开始时间为当前时间后1小时
- QDateTime defaultTime = QDateTime::currentDateTime().addSecs(3600);
- m_startTimeEdit->setDateTime(defaultTime);
- m_startTimeEdit->setMinimumDateTime(QDateTime::currentDateTime());
- // 设置默认时长为60分钟
- m_durationSpinBox->setValue(60);
- // 设置默认最大参与人数为10人
- m_maxParticipantsSpinBox->setValue(10);
- // 默认选择视频会议
- m_meetingTypeCombo->setCurrentIndex(0);
- }
- void CreateMeetingDialog::onPasswordCheckChanged(bool checked)
- {
- m_passwordEdit->setEnabled(checked);
- m_generatePasswordButton->setEnabled(checked);
- if (!checked) {
- m_passwordEdit->clear();
- }
- validateInput();
- }
- void CreateMeetingDialog::onMeetingNameChanged()
- {
- validateInput();
- }
- void CreateMeetingDialog::validateInput()
- {
- bool isValid = isValidInput();
- m_createButton->setEnabled(isValid);
- }
- void CreateMeetingDialog::generateRandomPassword()
- {
- const QString chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- QString password;
- for (int i = 0; i < 8; ++i) {
- int index = QRandomGenerator::global()->bounded(chars.length());
- password.append(chars.at(index));
- }
- m_passwordEdit->setText(password);
- }
- bool CreateMeetingDialog::isValidInput() const
- {
- // 检查会议名称
- if (m_meetingNameEdit->text().trimmed().isEmpty()) {
- return false;
- }
- // 检查开始时间
- if (m_startTimeEdit->dateTime() <= QDateTime::currentDateTime()) {
- return false;
- }
- // 如果启用了密码,检查密码有效性
- if (m_passwordCheckBox->isChecked()) {
- QString password = m_passwordEdit->text().trimmed();
- if (password.length() < 6 || password.length() > 12) {
- return false;
- }
- }
- return true;
- }
- MeetingInfo CreateMeetingDialog::getMeetingInfo() const
- {
- MeetingInfo info;
- info.meetingName = m_meetingNameEdit->text().trimmed();
- info.description = m_descriptionEdit->toPlainText().trimmed();
- info.startTime = m_startTimeEdit->dateTime();
- info.duration = m_durationSpinBox->value();
- info.maxParticipants = m_maxParticipantsSpinBox->value();
- info.requirePassword = m_passwordCheckBox->isChecked();
- info.password = m_passwordEdit->text().trimmed();
- info.recordMeeting = m_recordCheckBox->isChecked();
- info.meetingType = m_meetingTypeCombo->currentText();
- info.joinAsAdmin = m_joinAsAdminCheckBox->isChecked();
- return info;
- }
- bool CreateMeetingDialog::getJoinAsAdmin() const
- {
- return m_joinAsAdminCheckBox->isChecked();
- }
- void CreateMeetingDialog::accept()
- {
- if (!isValidInput()) {
- QString errorMsg;
- if (m_meetingNameEdit->text().trimmed().isEmpty()) {
- errorMsg = "请输入会议名称。";
- } else if (m_startTimeEdit->dateTime() <= QDateTime::currentDateTime()) {
- errorMsg = "开始时间必须晚于当前时间。";
- } else if (m_passwordCheckBox->isChecked()) {
- QString password = m_passwordEdit->text().trimmed();
- if (password.length() < 6 || password.length() > 12) {
- errorMsg = "密码长度必须在6-12位之间。";
- }
- }
- QMessageBox::warning(this, "输入错误", errorMsg);
- return;
- }
- m_meetingInfo = getMeetingInfo();
- TDialog::accept();
- }
- void CreateMeetingDialog::reject()
- {
- TDialog::reject();
- }
|