Use QImage. It can be used from non-gui threads.
Loading the QImage can be done in the non-gui thread, but then anything that touches the GUI (in this case manipulating a QListWidgetItem) must be done back on the gui thread. This is ok because it's the loading and image decoding that takes most of the time.
Also, please see this article about the use of QThread: https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong. Based on your code snippet, it looks like you may be falling into the trap described in the document.