Are you deleting them items somewhere in your code? Remember that QTreeWidgetItems are not QObjects and one must safely delete (remember to set to null) them manually. Your hasRoot logic seems a bit odd. QTreeWidget has a default invisible root item (QTreeWidget::invisibleRootItem()) by default to which all top-level items are added.
It's probably possible to achieve something similar by specifying some custom post-build steps, but yeah, choosing CMake over manual sln would be probably recommended, and makes this among many other stuff a lot easier.
Typically you want to declare your variables upon the first usage and not beforehand. Also, you don't want to declare an unused variable: this will likely produce a compiler warning and the variable is most likely removed by the compiler optimizations altogether anyways. An empty std::vector will take some bytes of memory, but the exact size depends on the used compiler, STL implementation, and target architecture. F.ex. figures for couple different MSVC implementations can be found here: http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx