如何将可折叠元素(Qmenu,Qcombobox)渲染到使用QT的位图缓冲液

How can collapsible elements (QMenu, QComboBox) be rendered to a bitmap buffer with Qt?

本文关键字:QT 缓冲 位图 可折叠 元素 Qcombobox Qmenu      更新时间:2023-10-16

在qt中,有多种方法可以将qwidgets渲染为位图缓冲区(例如qimage)这些方法可以是:

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

可能有很多变体。但是,它们似乎都没有产生可折叠的元素,例如(子)菜单或组合。

我也发现了QT中的一个BugReport,可能与之相关qtbug-10683(如果这个错误)

因此,如何将诸如扩展的Qcombobox或Qmenu之类的元素渲染到qimage或任何其他位图形式(例如字节阵列)。它应该用于渲染不可见的外屏幕内容,因此不是通过OS捕获当前桌面的。我为所有提示感到高兴,不在乎它是C ,Python还是仅说明这里发生的事情的单词。

好吧,问题:弹出窗口是独立的窗口。

您可以迭代孩子并捕获所有儿童窗户。然后将它们融合到最终图像或仅放入列表中。

要查找小部件是否是独立的窗口,您可以使用iswindow函数。

要捕获隐藏的UI元素,您可以使用QT元系统:

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);
    }
  }
}