下面的代码显示了通过重载视图的paintEvent方法来实现它的简单方法.绘画的文本应该使用样式机制来获取字体和笔/画笔,但我会留下一个敏锐的编辑器来抓取它.
它使用Qt 5及其C 11特性,这样做Qt 4或pre-C 11方式需要一个带有插槽的QObject派生类连接到旋转框的valueChanged信号. ListView的实现不需要在Qt 4和Qt 5之间进行更改.
#include
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();
}