capture_source_widget.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "capture_source_widget.h"
  2. #include "qdebug.h"
  3. #include <capturer/finder.h>
  4. #ifdef _WIN32
  5. #include <Windows.h>
  6. #endif
  7. CaptureSourceWidget::CaptureSourceWidget(QWidget* parent)
  8. : QWidget(parent)
  9. , m_captureComboBox(nullptr)
  10. , m_updateListBtn(nullptr)
  11. , m_captureGroup(nullptr)
  12. , m_layout(nullptr)
  13. {
  14. setupUi();
  15. updateCaptureList();
  16. }
  17. void CaptureSourceWidget::setupUi()
  18. {
  19. // 创建控件
  20. m_captureComboBox = new QComboBox(this);
  21. m_updateListBtn = new QPushButton("刷新窗口列表", this);
  22. m_captureGroup = new QGroupBox("捕获源", this);
  23. // 设置ComboBox属性
  24. m_captureComboBox->setMinimumWidth(20);
  25. // 创建布局
  26. m_layout = new QHBoxLayout();
  27. m_layout->addWidget(m_captureComboBox);
  28. m_layout->addWidget(m_updateListBtn);
  29. m_captureGroup->setLayout(m_layout);
  30. // 设置主布局
  31. QHBoxLayout* mainLayout = new QHBoxLayout(this);
  32. mainLayout->setContentsMargins(0, 0, 0, 0);
  33. mainLayout->addWidget(m_captureGroup);
  34. setLayout(mainLayout);
  35. // 连接信号槽
  36. connect(m_captureComboBox, &QComboBox::currentTextChanged,
  37. this, &CaptureSourceWidget::onComboBoxTextChanged);
  38. connect(m_captureComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
  39. this, &CaptureSourceWidget::onComboBoxIndexChanged);
  40. connect(m_updateListBtn, &QPushButton::clicked,
  41. this, &CaptureSourceWidget::onRefreshButtonClicked);
  42. }
  43. int CaptureSourceWidget::getCurrentIndex() const
  44. {
  45. return m_captureComboBox ? m_captureComboBox->currentIndex() : -1;
  46. }
  47. QVariant CaptureSourceWidget::getCurrentData() const
  48. {
  49. if (!m_captureComboBox) {
  50. return QVariant();
  51. }
  52. QVariant data = m_captureComboBox->currentData();
  53. QString text = m_captureComboBox->currentText();
  54. // 如果是窗口类型,验证HWND有效性
  55. if (text.startsWith("窗口: ")) {
  56. qintptr ptrHwnd = data.value<qintptr>();
  57. HWND hwnd = reinterpret_cast<HWND>(ptrHwnd);
  58. if (!IsWindow(hwnd)) {
  59. qDebug() << "CaptureSourceWidget: 检测到无效窗口句柄" << Qt::hex << ptrHwnd
  60. << "窗口标题:" << text << "- 自动刷新窗口列表";
  61. // 自动刷新窗口列表
  62. const_cast<CaptureSourceWidget*>(this)->updateCaptureList();
  63. // 尝试重新获取数据
  64. return m_captureComboBox->currentData();
  65. }
  66. }
  67. return data;
  68. }
  69. QString CaptureSourceWidget::getCurrentText() const
  70. {
  71. return m_captureComboBox ? m_captureComboBox->currentText() : QString();
  72. }
  73. void CaptureSourceWidget::setEnabled(bool enabled)
  74. {
  75. QWidget::setEnabled(enabled);
  76. if (m_captureComboBox) {
  77. m_captureComboBox->setEnabled(enabled);
  78. }
  79. if (m_updateListBtn) {
  80. m_updateListBtn->setEnabled(enabled);
  81. }
  82. }
  83. void CaptureSourceWidget::updateCaptureList()
  84. {
  85. if (!m_captureComboBox) {
  86. return;
  87. }
  88. m_captureComboBox->clear();
  89. // 添加屏幕列表
  90. auto&& monitorList = MonitorFinder::GetList(true);
  91. for (auto&& monitor : monitorList) {
  92. QString text = "屏幕: " + QString::fromStdWString(monitor.title);
  93. m_captureComboBox->addItem(text, QVariant::fromValue(qintptr(monitor.monitor)));
  94. }
  95. // 添加窗口列表
  96. auto&& windowList = WindowFinder::GetList(true);
  97. for (auto&& window : windowList) {
  98. QString text = "窗口: " + QString::fromStdWString(window.title);
  99. m_captureComboBox->addItem(text, QVariant::fromValue(qintptr(window.hwnd)));
  100. }
  101. }
  102. void CaptureSourceWidget::onComboBoxTextChanged(const QString& text)
  103. {
  104. emit captureSourceTextChanged(text);
  105. }
  106. void CaptureSourceWidget::onComboBoxIndexChanged(int index)
  107. {
  108. emit captureSourceIndexChanged(index);
  109. }
  110. void CaptureSourceWidget::onRefreshButtonClicked()
  111. {
  112. updateCaptureList();
  113. emit refreshRequested();
  114. }