QTableView 和 ItemDelegate,用于显示进度条
QTableView and ItemDelegate for showing a progress bar
我有一个连接到我的自定义模型的QTableView
:
class QueueItem {
public:
enum QueueStatus { PENDING = 0, INPROGRESS, FINISHED, FAILED };
private:
QueueStatus status_;
QString filename_;
QString localPath_;
long long filesize_;
int progress_;
public:
QueueItem(const QString & file, const QString & localPath) :
filename_(file), localPath_(localPath)
{
filesize_ = 0;
progress_ = 0;
status_ = PENDING;
}
QString getFilename() const
{
return filename_;
}
QString getLocalPath() const
{
return localPath_;
}
long long getFilesize() const
{
return filesize_;
}
int getProgess() const
{
return progress_;
}
QueueStatus getStatus() const
{
return status_;
}
void setProgress(unsigned int prg){
progress_ = prg;
}
void setStatus(QueueItem::QueueStatus status){
status_ = status;
}
};
class QueueModel : public QAbstractTableModel {
private:
QList<QueueItem> data_;
public:
QueueModel(QObject * parent = 0) : QAbstractTableModel(parent) {}
int rowCount(const QModelIndex &) const { return data_.count(); }
int columnCount(const QModelIndex &) const { return 4; }
QVariant data(const QModelIndex &index, int role) const {
if (role != Qt::DisplayRole && role != Qt::EditRole) return QVariant();
const QueueItem & queueItem = data_[index.row()];
switch (index.column()) {
case 0: return queueItem.getFilename();
case 1: return queueItem.getFilesize() + " bytes";
case 2: return queueItem.getProgess() + "%";
case 3: {
std::string str;
switch (queueItem.getStatus()){
case QueueItem::PENDING :
str = "Pending";
break;
case QueueItem::INPROGRESS:
str = "In Progress";
break;
case QueueItem::FINISHED:
str = "Finished";
break;
case QueueItem::FAILED:
str = "Failed";
break;
default:
str = "Unkown";
}
return QString::fromStdString(str);
}
default: return QVariant();
};
}
QVariant headerData(int section, Qt::Orientation orientation, int role) const {
if (orientation != Qt::Horizontal) return QVariant();
if (role != Qt::DisplayRole) return QVariant();
switch (section) {
case 0: return "Filename";
case 1: return "Filesize";
case 2: return "Progress";
case 3: return "Status";
default: return QVariant();
}
}
void refresh(){
emit dataChanged(index(0, 0), index(data_.count()-1, 5));
}
void append(const QueueItem & queueItem) {
beginInsertRows(QModelIndex(), data_.count(), data_.count());
data_.append(queueItem);
endInsertRows();
}
};
这就是它的使用方式:
// Queue Table
ui.tvQueue->setModel(&queueModel_);
ui.tvQueue->setItemDelegateForColumn(2,new ProgressBarDelegate(this));
所以我创建了以下项目委托:
class ProgressBarDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
ProgressBarDelegate::ProgressBarDelegate(QObject *parent = 0)
: QStyledItemDelegate(parent)
{
}
void ProgressBarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
int progress = index.model()->data().toInt(); // How do I access my models .progress_ property?
QStyleOptionProgressBar progressBarOption;
progressBarOption.rect = option.rect;
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.progress = progress;
progressBarOption.text = QString::number(progress) + "%";
progressBarOption.textVisible = true;
QApplication::style()->drawControl(QStyle::CE_ProgressBar,
&progressBarOption, painter);
}
};
进度条显示正确,但始终位于位置 0。我希望问题位于行的最后一部分int progress = index.model()->data().toInt();
我没有得到模型的正确progress_值,但始终为 0。如何访问我的模型progress_属性?
不能将包含数字字符以外的字符串转换为数字。第 2 列数据包含 % 字符,因此请在转换前将其删除:
int progress = index.model()->data().toString().replace("%", "").toInt();
相关文章:
- 程序应该显示文件的最后5行,但它不适用于大文件
- WinDBG适用于从Visual Studio 2015保存的转储,但不适用于任务管理器。显示异常代码"not found"
- 用于检测特定频率的直接显示滤波器
- 递归解决方案,用于显示线性链表数组
- 回调方法显示错误,类型为"void(*)"的值不能用于初始化类型的实体
- c ++ 是否有任何用于列出 Windows 驱动程序管理器控制台中显示的设备驱动程序的 Windows API?
- 单个模板功能,用于显示不同容器的内容
- 如何显示用于车辆分类的 Blob 大小
- 如果我尝试将 graphics.h 用于 c/c++ 时显示错误,我该怎么办?
- 用于显示矩阵元素的C 函数显示垃圾值
- 递归函数,用于使用位掩码 c++ 显示集合的所有子集
- 合适的C 小部件,用于显示静态HTML页面
- 用于在许多Qopenglwidget中显示的FBO渲染的全局OpenGL上下文
- 用于直接显示筛选器的 CoCreateInstance 返回E_NOINTERFACE
- 用于显示字符串每个字符的 for 循环 |C++
- 从QT,Win7下,如何知道哪种窗口样式用于显示
- 使用Qt显示JPG图像不适用于发布可执行文件
- 当整数变量用于在 c++ 中声明数组大小时,错误显示为"Expression must have a const value"
- 为什么我的输出没有显示"while"语句。while 语句用于显示所有信息
- 'top'程序用于在屏幕上重新显示数据的技术是什么?