QListView 在列表为空时显示文本

Posted

技术标签:

【中文标题】QListView 在列表为空时显示文本【英文标题】:QListView show text when list is empty 【发布时间】:2013-12-24 18:51:57 【问题描述】:

当 QListView 中没有项目时,我想显示一些文本(如“无项目”)。 我试图重写QListView的paintEvent方法,但是没有任何效果。

【问题讨论】:

未来:你需要展示你的代码。您是否尝试过并不重要 - 我们需要查看您的代码来帮助您,否则我们必须从头开始编写它,您的尝试对我们帮助您毫无用处。对于像您这样的每一个问题,您都可以回答一大堆恰当的问题,快速查看代码即可发现问题所在。 【参考方案1】:

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

它使用 Qt 5 和它的 C++11 特性,以 Qt 4 或 C++11 之前的方式执行它需要一个带有插槽的 QObject 派生类来连接到微调框的valueChanged 信号。 ListView 的实现不需要在 Qt 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();

【讨论】:

太棒了!谢谢!【参考方案2】:

如果您使用 QListView,您可能有一个包含要显示的数据的自定义模型。当您的模型为空时,这可能是返回“No items”的最佳位置。

【讨论】:

这混淆了演示和事物的业务方面。这样的模型需要是真正的视图模型,充当代理模型。

以上是关于QListView 在列表为空时显示文本的主要内容,如果未能解决你的问题,请参考以下文章

通过 CSS 在文本框悬停时显示列表框

输入 jQuery 自动完成文本框时显示整个列表

检查表单输入是不是为空,如果不是,则在按下提交按钮时显示隐藏的 div

在我输入每个文本时显示项目列表

如何仅在悬停时显示截断的文本而不更改框列表的高度?

Angular:ngFor数据项并在为空时显示自定义消息