Here's a solution using forest which is an extremely flexible and powerful package for drawing trees. It offers the automatisation of qtree plus the ability to customise the format and placement of individual nodes, branches and edges, when required.
It does an especially good job of automatically packing the nodes to make compact trees. [But you could further compress the tree with manual adjustments if required.]
\documentclass[tikz,border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={
grow'=0,
parent anchor=east,
child anchor=west,
anchor=west,
thick,
draw,
edge path={
\noexpand\path [draw, thick, \forestoption{edge}] (!u.parent anchor) -- +(5pt,0) |- (.child anchor)\forestoption{edge label};
},
if level=1{
tier=children,
if n=2{
for children={
tier=grandchildren 2,
delay={
edge path={
\noexpand\path [draw, thick, \forestoption{edge}] (!u.parent anchor) -| ([xshift=-5pt].child anchor) -- (.child anchor)\forestoption{edge label};
},
}
},
}{
for children={tier=grandchildren 1}
},
}{},
}
[root
[child 1
[grandchild 1
[,phantom, tier=grandchildren 2]
]
[grandchild 2]
[grandchild 3]
]
[child 2
[grandchild 4]
[grandchild 5]
[grandchild 6]
]
[child 3
[grandchild 7]
[grandchild 8]
]
]
\end{forest}
\end{document}

Note that if you just want the grandchildren packed as shown in your answer, the solution is significantly simpler:
\begin{forest}
for tree={
grow'=0,
parent anchor=east,
child anchor=west,
anchor=west,
thick,
draw,
edge path={
\noexpand\path [draw, thick, \forestoption{edge}] (!u.parent anchor) -- +(5pt,0) |- (.child anchor)\forestoption{edge label};
},
}
[root
[child 1
[grandchild 1]
[grandchild 2]
[grandchild 3]
[grandchild 4]
]
[child 2]
[child 3]
[child 4
[grandchild 7]
[grandchild 8]
]
]
\end{forest}
