如何使用Qt将可折叠元素(QMenu、QComboBox)渲染到位图缓冲区?

2024-09-27 09:34:26 发布

您现在位置:Python中文网/ 问答频道 /正文

在Qt中,有多种方法可以将QWidgets呈现到位图缓冲区(例如QImage) 这些方法可以是:

QWidget.render(QPainter, ...)
QWidget.grab()
QPixmap::grabWidget(QWidget)
QPixmap::grabWindow( ID )

有很多可能的变体。但是,它们似乎都没有呈现可折叠的元素,比如(子)菜单或组合框。在

我还在Qt中发现了一个可能与之相关的错误报告 QTBUG-10683(如果这是一个bug的话)

那么,如何将扩展的QComboBox或QMenu等元素呈现为QImage或任何其他位图形式(如字节数组)。它应该适用于呈现不可见的屏幕外内容,因此不能通过操作系统捕获当前桌面。我对所有的暗示感到高兴,不管它是C++、Python还是仅仅解释这里发生的事情。在


Tags: 方法id元素变体renderqt缓冲区grab
1条回答
网友
1楼 · 发布于 2024-09-27 09:34:26

问题是:弹出窗口是独立的窗口。在

您可以迭代子窗口并捕获所有子窗口。然后把它们混合成最终的图像,或者只是放在列表中。在

若要查找小部件是否是独立窗口,可以使用isWindow函数。在

要捕获隐藏的UI元素,可以使用qt-meta-system:

void captureHiddenItems(QWidget* widget, QList<QImage>& list) {
  if(auto* comboBox = qobject_cast<QComboBox*>(widget)) {
    comboBox->showPopup();
    captureChildWindows(comboBox, list);
    comboBox->hidePopup();
  } else if(auto* menubar  = qobject_cast<QMenuBar*>(widget) ) {
    capturePopUpMenus(menubar->actions(), list);
  }
}

void capturePopUpMenus(QList<QAction*> actions, QList<QImage>& list) {
  for(auto* action : actions) {
    if(auto* menu = action->menu()) {
      captureWidget(menu, list);
      capturePopUpMenus(menu->actions(), list);
    }
  }
}

相关问题 更多 >

    热门问题