 <p>The code below shows a simple way of doing it by overloading the <code>paintEvent</code> method of the view. Painting of the text should probably use the style mechanism to obtain the font and pen/brush, but I'll leave that up for grabs by a keen editor.</p> <p>It uses Qt 5 and its C++11 features, doing it the Qt 4 or pre-C++11 way would require a QObject-deriving class with a slot to connect to the spin box's <code>valueChanged</code> signal. The implementation of <code>ListView</code> doesn't need to change between Qt 4 and Qt 5.</p> <p><img src="https://i.stack.imgur.com/OU1iW.png" alt="screenshot"></p> <pre class="lang-cpp prettyprint-override"><code>#include &lt;QtWidgets&gt; class ListView : public QListView { void paintEvent(QPaintEvent *e) { QListView::paintEvent(e); if (model() &amp;&amp; model()-&gt;rowCount(rootIndex()) &gt; 0) return; // The view is empty. QPainter p(this-&gt;viewport()); p.drawText(rect(), Qt::AlignCenter, "No Items"); } public: ListView(QWidget* parent = 0) : QListView(parent) {} }; int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget window; QFormLayout layout(&amp;window); ListView view; QSpinBox spin; QStringListModel model; layout.addRow(&amp;view); layout.addRow("Item Count", &amp;spin); QObject::connect(&amp;spin, (void (QSpinBox::*)(int))&amp;QSpinBox::valueChanged, [&amp;](int value){ QStringList list; for (int i = 0; i &lt; value; ++i) list &lt;&lt; QString("Item %1").arg(i); model.setStringList(list); }); view.setModel(&amp;model); window.show(); return a.exec(); } </code></pre>