joinmeetingdialog.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #include "joinmeetingdialog.h"
  2. #include <QMessageBox>
  3. #include <QRegularExpression>
  4. #include <QRegularExpressionValidator>
  5. // 移除:#include <QEventLoop> 与 #include <QCloseEvent>
  6. JoinMeetingDialog::JoinMeetingDialog(QWidget *parent)
  7. : TDialog(parent)
  8. , m_mainLayout(nullptr)
  9. , m_tabWidget(nullptr)
  10. , m_manualTab(nullptr)
  11. , m_manualLayout(nullptr)
  12. , m_manualLabel(nullptr)
  13. , m_meetingIdEdit(nullptr)
  14. , m_selectTab(nullptr)
  15. , m_selectLayout(nullptr)
  16. , m_selectLabel(nullptr)
  17. , m_meetingListWidget(nullptr)
  18. , m_buttonLayout(nullptr)
  19. , m_joinButton(nullptr)
  20. , m_cancelButton(nullptr)
  21. {
  22. setWindowTitle("加入会议");
  23. resize(400, 300);
  24. setupUI();
  25. // 默认选择手动输入标签页
  26. m_tabWidget->setCurrentIndex(0);
  27. // 初始状态下禁用加入按钮
  28. m_joinButton->setEnabled(false);
  29. }
  30. JoinMeetingDialog::~JoinMeetingDialog() {}
  31. void JoinMeetingDialog::setupUI()
  32. {
  33. QWidget *content = new QWidget(this);
  34. m_mainLayout = new QVBoxLayout(content);
  35. m_mainLayout->setContentsMargins(20, 20, 20, 20);
  36. m_mainLayout->setSpacing(15);
  37. // 创建标签页控件
  38. m_tabWidget = new QTabWidget(content);
  39. // 手动输入标签页
  40. m_manualTab = new QWidget();
  41. m_manualLayout = new QVBoxLayout(m_manualTab);
  42. m_manualLayout->setContentsMargins(15, 15, 15, 15);
  43. m_manualLayout->setSpacing(10);
  44. m_manualLabel = new QLabel("请输入会议ID:", m_manualTab);
  45. m_meetingIdEdit = new QLineEdit(m_manualTab);
  46. m_meetingIdEdit->setPlaceholderText("例如:123456789");
  47. // 设置输入验证器(只允许数字和字母)
  48. QRegularExpression regex("[A-Za-z0-9]{1,20}");
  49. QRegularExpressionValidator *validator = new QRegularExpressionValidator(regex, this);
  50. m_meetingIdEdit->setValidator(validator);
  51. connect(m_meetingIdEdit, &QLineEdit::textChanged, this, &JoinMeetingDialog::onMeetingIdChanged);
  52. m_manualLayout->addWidget(m_manualLabel);
  53. m_manualLayout->addWidget(m_meetingIdEdit);
  54. m_manualLayout->addStretch();
  55. m_tabWidget->addTab(m_manualTab, "手动输入");
  56. // 选择会议标签页
  57. m_selectTab = new QWidget();
  58. m_selectLayout = new QVBoxLayout(m_selectTab);
  59. m_selectLayout->setContentsMargins(15, 15, 15, 15);
  60. m_selectLayout->setSpacing(10);
  61. m_selectLabel = new QLabel("选择可用的会议:", m_selectTab);
  62. m_meetingListWidget = new QListWidget(m_selectTab);
  63. connect(m_meetingListWidget,
  64. &QListWidget::itemClicked,
  65. this,
  66. &JoinMeetingDialog::onMeetingItemClicked);
  67. connect(m_meetingListWidget, &QListWidget::itemDoubleClicked, this, &JoinMeetingDialog::accept);
  68. m_selectLayout->addWidget(m_selectLabel);
  69. m_selectLayout->addWidget(m_meetingListWidget);
  70. m_tabWidget->addTab(m_selectTab, "选择会议");
  71. // 按钮布局
  72. m_buttonLayout = new QHBoxLayout();
  73. m_buttonLayout->addStretch();
  74. m_cancelButton = new QPushButton("取消", content);
  75. m_joinButton = new QPushButton("加入会议", content);
  76. connect(m_cancelButton, &QPushButton::clicked, this, &JoinMeetingDialog::reject);
  77. connect(m_joinButton, &QPushButton::clicked, this, &JoinMeetingDialog::accept);
  78. m_buttonLayout->addWidget(m_cancelButton);
  79. m_buttonLayout->addWidget(m_joinButton);
  80. // 添加到主布局
  81. m_mainLayout->addWidget(m_tabWidget);
  82. m_mainLayout->addLayout(m_buttonLayout);
  83. // 挂到 TWidget 的内容区
  84. mainLayout()->addWidget(content);
  85. }
  86. void JoinMeetingDialog::setAvailableMeetings(const QStringList &meetingIds,
  87. const QStringList &meetingNames)
  88. {
  89. m_meetingIds = meetingIds;
  90. m_meetingNames = meetingNames;
  91. m_meetingListWidget->clear();
  92. for (int i = 0; i < meetingIds.size() && i < meetingNames.size(); ++i) {
  93. QString displayText = QString("%1 - %2").arg(meetingIds[i], meetingNames[i]);
  94. QListWidgetItem *item = new QListWidgetItem(displayText);
  95. item->setData(Qt::UserRole, meetingIds[i]); // 存储会议ID
  96. m_meetingListWidget->addItem(item);
  97. }
  98. // 如果没有可用会议,禁用选择标签页
  99. m_tabWidget->setTabEnabled(1, !meetingIds.isEmpty());
  100. }
  101. QString JoinMeetingDialog::getSelectedMeetingId() const
  102. {
  103. return m_selectedMeetingId;
  104. }
  105. void JoinMeetingDialog::onMeetingItemClicked()
  106. {
  107. QListWidgetItem *currentItem = m_meetingListWidget->currentItem();
  108. if (currentItem) {
  109. m_selectedMeetingId = currentItem->data(Qt::UserRole).toString();
  110. m_joinButton->setEnabled(true);
  111. }
  112. }
  113. void JoinMeetingDialog::onMeetingIdChanged()
  114. {
  115. QString text = m_meetingIdEdit->text().trimmed();
  116. if (m_tabWidget->currentIndex() == 0) { // 手动输入标签页
  117. m_selectedMeetingId = text;
  118. m_joinButton->setEnabled(!text.isEmpty());
  119. }
  120. }
  121. void JoinMeetingDialog::validateInput()
  122. {
  123. bool isValid = false;
  124. if (m_tabWidget->currentIndex() == 0) { // 手动输入
  125. isValid = !m_meetingIdEdit->text().trimmed().isEmpty();
  126. m_selectedMeetingId = m_meetingIdEdit->text().trimmed();
  127. } else { // 选择会议
  128. QListWidgetItem *currentItem = m_meetingListWidget->currentItem();
  129. isValid = (currentItem != nullptr);
  130. if (isValid) {
  131. m_selectedMeetingId = currentItem->data(Qt::UserRole).toString();
  132. }
  133. }
  134. m_joinButton->setEnabled(isValid);
  135. }
  136. void JoinMeetingDialog::accept()
  137. {
  138. validateInput();
  139. if (m_selectedMeetingId.isEmpty()) {
  140. QMessageBox::warning(this, "输入错误", "请输入或选择一个有效的会议ID。");
  141. return;
  142. }
  143. TDialog::accept();
  144. }
  145. void JoinMeetingDialog::reject()
  146. {
  147. m_selectedMeetingId.clear();
  148. TDialog::reject();
  149. }
  150. // 末尾不再包含 exec()/closeEvent 的本地实现,使用 TDialog 的默认实现