列表为空时,QListView显示文本

lig*_*tep 5 qt qlistview

当QListView中没有项目时,我想显示一些文本(如"无项目").
我试图覆盖QListView的paintEvent方法,但它没有任何效果.

Rei*_*ica 10

下面的代码显示了通过重载paintEvent视图方法来实现它的简单方法.绘画的文本应该使用样式机制来获取字体和笔/画笔,但我会留下一个敏锐的编辑器来抓取它.

它使用Qt 5及其C++ 11特性,这样做Qt 4或pre-C++ 11方式需要一个带有插槽的QObject派生类来连接到旋转框的valueChanged信号.ListViewQt 4和Qt 5之间的实现不需要改变.

截图

#include <QtWidgets>

class ListView : public QListView {
   void paintEvent(QPaintEvent *e) {
      QListView::paintEvent(e);
      if (model() && model()->rowCount(rootIndex()) > 0) return;
      // The view is empty.
      QPainter p(this->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(&window);
   ListView view;
   QSpinBox spin;
   QStringListModel model;
   layout.addRow(&view);
   layout.addRow("Item Count", &spin);
   QObject::connect(&spin, (void (QSpinBox::*)(int))&QSpinBox::valueChanged,
                    [&](int value){
      QStringList list;
      for (int i = 0; i < value; ++i) list << QString("Item %1").arg(i);
      model.setStringList(list);
   });
   view.setModel(&model);
   window.show();
   return a.exec();
}
Run Code Online (Sandbox Code Playgroud)