[Interest] Best way to get a QWidget from a device context (HDC)

Thiago Macieira thiago.macieira at intel.com
Thu Jan 8 00:31:16 CET 2015

On Wednesday 07 January 2015 15:16:56 Jason Dolan wrote:
> I’m stuck with some 3rd party code where the input is a device context
> (HDC), and I need to get the widget it’s associated with.
> My current implementation (completely untested as of yet) is:
> QWidget *w = QWidget::find((WId)WindowFromDC(hDC));
> #1: I’m not even sure this will work (although I think it will) — I’m coding
> under OS X right now and will have to test on our windows build machine in
> a bit 
> #2: This needs to be as fast as possible as this can be called ALOT. 
> Any time the function says “find” I get worried about speed…

It's pretty quick:

QWidget *QWidget::find(WId id)
    return QWidgetPrivate::mapper ? QWidgetPrivate::mapper->value(id, 0) : 0;

And QWidgetPrivate::mapper is a QHash<WId, QWidget *>, so this should be O(1) 
for the general case.

Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center

More information about the Interest mailing list