@marlonbuilder
For your choice of using a thread --- and especially if you are not familiar with threads and their requirements --- as @jsulm has said it is not clear why you need one at all. Try it from the main event loop and only look into threads if there is a problem. Newcomers to Qt often rush into sub-threads when there is no need.
For your updating of widget(s). Assuming you have some widget listening for dataChanged() signal. If you say that is happening too frequently and thereby causing lag --- is it? have you actually tried? if you are only emitting dataChanged() "a certain number of times per second" that may be fine, depending on how many times --- then you have a couple of choices. Basically you would want to "delay" emission of signal causing update so that you can "accumulate" multiple updates into one update for redraw. You might interpose a QIdentityProxyModel between your model and the widget to control signal emission. Or since you seem to have a setStat() which calls dataChanged() explicitly itself you might do it there. You would introduce a QTimer --- single shot or repeating --- which you start when setStat() is called and only when that times out would you emit a dataChanged(), with the data as it is at that point, having accumulated/ignored the earlier updates. Make the frequency of the timer sufficient for user, e.g. does user really need to see updates more than, say, 10 times per second?
Although the situation is rather different, the principle is similar to that recently discussed in my post at https://forum.qt.io/topic/164540/spin-box-and-slider-tracking/11.