joinmeetingdialog.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. #include "joinmeetingdialog.h"
  2. #include <QMessageBox>
  3. #include <QRegularExpression>
  4. #include <QRegularExpressionValidator>
  5. JoinMeetingDialog::JoinMeetingDialog(QWidget *parent)
  6. : QDialog(parent)
  7. , m_mainLayout(nullptr)
  8. , m_tabWidget(nullptr)
  9. , m_manualTab(nullptr)
  10. , m_manualLayout(nullptr)
  11. , m_manualLabel(nullptr)
  12. , m_meetingIdEdit(nullptr)
  13. , m_selectTab(nullptr)
  14. , m_selectLayout(nullptr)
  15. , m_selectLabel(nullptr)
  16. , m_meetingListWidget(nullptr)
  17. , m_buttonLayout(nullptr)
  18. , m_joinButton(nullptr)
  19. , m_cancelButton(nullptr)
  20. {
  21. setWindowTitle("加入会议");
  22. setModal(true);
  23. resize(400, 300);
  24. setupUI();
  25. applyStyles();
  26. // 默认选择手动输入标签页
  27. m_tabWidget->setCurrentIndex(0);
  28. // 初始状态下禁用加入按钮
  29. m_joinButton->setEnabled(false);
  30. }
  31. JoinMeetingDialog::~JoinMeetingDialog()
  32. {
  33. }
  34. void JoinMeetingDialog::setupUI()
  35. {
  36. m_mainLayout = new QVBoxLayout(this);
  37. m_mainLayout->setContentsMargins(20, 20, 20, 20);
  38. m_mainLayout->setSpacing(15);
  39. // 创建标签页控件
  40. m_tabWidget = new QTabWidget(this);
  41. // 手动输入标签页
  42. m_manualTab = new QWidget();
  43. m_manualLayout = new QVBoxLayout(m_manualTab);
  44. m_manualLayout->setContentsMargins(15, 15, 15, 15);
  45. m_manualLayout->setSpacing(10);
  46. m_manualLabel = new QLabel("请输入会议ID:", m_manualTab);
  47. m_meetingIdEdit = new QLineEdit(m_manualTab);
  48. m_meetingIdEdit->setPlaceholderText("例如:123456789");
  49. // 设置输入验证器(只允许数字和字母)
  50. QRegularExpression regex("[A-Za-z0-9]{1,20}");
  51. QRegularExpressionValidator *validator = new QRegularExpressionValidator(regex, this);
  52. m_meetingIdEdit->setValidator(validator);
  53. connect(m_meetingIdEdit, &QLineEdit::textChanged, this, &JoinMeetingDialog::onMeetingIdChanged);
  54. m_manualLayout->addWidget(m_manualLabel);
  55. m_manualLayout->addWidget(m_meetingIdEdit);
  56. m_manualLayout->addStretch();
  57. m_tabWidget->addTab(m_manualTab, "手动输入");
  58. // 选择会议标签页
  59. m_selectTab = new QWidget();
  60. m_selectLayout = new QVBoxLayout(m_selectTab);
  61. m_selectLayout->setContentsMargins(15, 15, 15, 15);
  62. m_selectLayout->setSpacing(10);
  63. m_selectLabel = new QLabel("选择可用的会议:", m_selectTab);
  64. m_meetingListWidget = new QListWidget(m_selectTab);
  65. connect(m_meetingListWidget, &QListWidget::itemClicked, this, &JoinMeetingDialog::onMeetingItemClicked);
  66. connect(m_meetingListWidget, &QListWidget::itemDoubleClicked, this, &JoinMeetingDialog::accept);
  67. m_selectLayout->addWidget(m_selectLabel);
  68. m_selectLayout->addWidget(m_meetingListWidget);
  69. m_tabWidget->addTab(m_selectTab, "选择会议");
  70. // 按钮布局
  71. m_buttonLayout = new QHBoxLayout();
  72. m_buttonLayout->addStretch();
  73. m_cancelButton = new QPushButton("取消", this);
  74. m_joinButton = new QPushButton("加入会议", this);
  75. connect(m_cancelButton, &QPushButton::clicked, this, &JoinMeetingDialog::reject);
  76. connect(m_joinButton, &QPushButton::clicked, this, &JoinMeetingDialog::accept);
  77. m_buttonLayout->addWidget(m_cancelButton);
  78. m_buttonLayout->addWidget(m_joinButton);
  79. // 添加到主布局
  80. m_mainLayout->addWidget(m_tabWidget);
  81. m_mainLayout->addLayout(m_buttonLayout);
  82. }
  83. void JoinMeetingDialog::applyStyles()
  84. {
  85. setStyleSheet(
  86. "JoinMeetingDialog {"
  87. " background-color: #f8f9fa;"
  88. "}"
  89. "QTabWidget::pane {"
  90. " border: 1px solid #dee2e6;"
  91. " border-radius: 5px;"
  92. " background-color: white;"
  93. "}"
  94. "QTabWidget::tab-bar {"
  95. " alignment: center;"
  96. "}"
  97. "QTabBar::tab {"
  98. " background-color: #e9ecef;"
  99. " border: 1px solid #dee2e6;"
  100. " border-bottom: none;"
  101. " border-top-left-radius: 5px;"
  102. " border-top-right-radius: 5px;"
  103. " padding: 8px 16px;"
  104. " margin-right: 2px;"
  105. "}"
  106. "QTabBar::tab:selected {"
  107. " background-color: white;"
  108. " border-bottom: 1px solid white;"
  109. "}"
  110. "QTabBar::tab:hover {"
  111. " background-color: #f8f9fa;"
  112. "}"
  113. "QLabel {"
  114. " font-size: 14px;"
  115. " color: #495057;"
  116. " font-weight: 500;"
  117. "}"
  118. "QLineEdit {"
  119. " border: 2px solid #e9ecef;"
  120. " border-radius: 6px;"
  121. " padding: 8px 12px;"
  122. " font-size: 14px;"
  123. " background-color: white;"
  124. "}"
  125. "QLineEdit:focus {"
  126. " border-color: #007bff;"
  127. " outline: none;"
  128. "}"
  129. "QListWidget {"
  130. " border: 2px solid #e9ecef;"
  131. " border-radius: 6px;"
  132. " background-color: white;"
  133. " selection-background-color: #007bff;"
  134. " selection-color: white;"
  135. "}"
  136. "QListWidget::item {"
  137. " padding: 8px 12px;"
  138. " border-bottom: 1px solid #f8f9fa;"
  139. "}"
  140. "QListWidget::item:hover {"
  141. " background-color: #f8f9fa;"
  142. "}"
  143. "QPushButton {"
  144. " border: none;"
  145. " border-radius: 6px;"
  146. " padding: 10px 20px;"
  147. " font-size: 14px;"
  148. " font-weight: 500;"
  149. " min-width: 80px;"
  150. "}"
  151. "#joinButton {"
  152. " background-color: #007bff;"
  153. " color: white;"
  154. "}"
  155. "#joinButton:hover {"
  156. " background-color: #0056b3;"
  157. "}"
  158. "#joinButton:pressed {"
  159. " background-color: #004085;"
  160. "}"
  161. "#joinButton:disabled {"
  162. " background-color: #6c757d;"
  163. " color: #adb5bd;"
  164. "}"
  165. "#cancelButton {"
  166. " background-color: #6c757d;"
  167. " color: white;"
  168. "}"
  169. "#cancelButton:hover {"
  170. " background-color: #545b62;"
  171. "}"
  172. "#cancelButton:pressed {"
  173. " background-color: #3d4142;"
  174. "}"
  175. );
  176. m_joinButton->setObjectName("joinButton");
  177. m_cancelButton->setObjectName("cancelButton");
  178. }
  179. void JoinMeetingDialog::setAvailableMeetings(const QStringList &meetingIds, const QStringList &meetingNames)
  180. {
  181. m_meetingIds = meetingIds;
  182. m_meetingNames = meetingNames;
  183. m_meetingListWidget->clear();
  184. for (int i = 0; i < meetingIds.size() && i < meetingNames.size(); ++i) {
  185. QString displayText = QString("%1 - %2").arg(meetingIds[i], meetingNames[i]);
  186. QListWidgetItem *item = new QListWidgetItem(displayText);
  187. item->setData(Qt::UserRole, meetingIds[i]); // 存储会议ID
  188. m_meetingListWidget->addItem(item);
  189. }
  190. // 如果没有可用会议,禁用选择标签页
  191. m_tabWidget->setTabEnabled(1, !meetingIds.isEmpty());
  192. }
  193. QString JoinMeetingDialog::getSelectedMeetingId() const
  194. {
  195. return m_selectedMeetingId;
  196. }
  197. void JoinMeetingDialog::onMeetingItemClicked()
  198. {
  199. QListWidgetItem *currentItem = m_meetingListWidget->currentItem();
  200. if (currentItem) {
  201. m_selectedMeetingId = currentItem->data(Qt::UserRole).toString();
  202. m_joinButton->setEnabled(true);
  203. }
  204. }
  205. void JoinMeetingDialog::onMeetingIdChanged()
  206. {
  207. QString text = m_meetingIdEdit->text().trimmed();
  208. if (m_tabWidget->currentIndex() == 0) { // 手动输入标签页
  209. m_selectedMeetingId = text;
  210. m_joinButton->setEnabled(!text.isEmpty());
  211. }
  212. }
  213. void JoinMeetingDialog::validateInput()
  214. {
  215. bool isValid = false;
  216. if (m_tabWidget->currentIndex() == 0) { // 手动输入
  217. isValid = !m_meetingIdEdit->text().trimmed().isEmpty();
  218. m_selectedMeetingId = m_meetingIdEdit->text().trimmed();
  219. } else { // 选择会议
  220. QListWidgetItem *currentItem = m_meetingListWidget->currentItem();
  221. isValid = (currentItem != nullptr);
  222. if (isValid) {
  223. m_selectedMeetingId = currentItem->data(Qt::UserRole).toString();
  224. }
  225. }
  226. m_joinButton->setEnabled(isValid);
  227. }
  228. void JoinMeetingDialog::accept()
  229. {
  230. validateInput();
  231. if (m_selectedMeetingId.isEmpty()) {
  232. QMessageBox::warning(this, "输入错误", "请输入或选择一个有效的会议ID。");
  233. return;
  234. }
  235. QDialog::accept();
  236. }
  237. void JoinMeetingDialog::reject()
  238. {
  239. m_selectedMeetingId.clear();
  240. QDialog::reject();
  241. }