capture_source_widget.cpp 3.8 KB

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