QScrollBar * vs = edit->verticalScrollBar();
int numLines = vs->pageStep() / vs->singleStep();

Ошибочка

pageStep(), singleStep() и LCPS("Line Count per Screen), в общем случае не связаны между собой, пример:
pageStep() = (LCPS+1)/2;
singleStep() = 3
=====
Кол-во видимых строк зависит от видимой области и текущих заданных от фонтов, расстояния между строками, итд. Все это определяется текущей реализации QTextEdit.
Надо посмотреть методы QTextEdit может есть определения текущего кол-ва строк, хотя судя по "приколам" троллей данные методы в привате.
Надо посмотреть реализацию!
Возможно что-нибудь простое:
QFontMetrics FontMetrics(font());
int LineHeight = FontMetrics.lineSpacing();
int FullLinesCount = TextScreenHeight/LineHeight;
int TotalLinesCount = (TextScreenHeight+LineHeight-1)/LineHeight;
Где:
TextScreenHeight - высота области для отисовки текста
FullLinesCount - кол-во полностью видимых строк
TotalLinesCount - кол-во видимых строк включая частично обрезанные верхнюю и/или нижнюю