- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 QTreeView用QStandardItemModel .我的模型可以更改为以 4 种不同的模式显示它的项目:
我创建了 QStyledItemDelegate 的子类以显示星星(如 Star Delegate Example )
在模式 2 或 3 中,可以在选项中启用封面相册(并设置大小,如 64 x 64 像素)。
为了减少内存占用,当项目显示在屏幕上时,封面会延迟加载。每次启动音频播放器时,没有后台进程扫描硬盘。
它运行良好,但用户体验有待改进。事实上,通过使用滚轮鼠标,可以毫无问题地加载封面。当使用垂直滚动条时,在 500 个相册库中向下移动它,加载 *.jpeg 或 *.png 时您可以听到硬盘驱动器的抓取声。加载所有封面后,滚动非常流畅(我需要稍后处理它们)。
我已将 QScrollBar 子类化并检测到 MousePressEvent和 MouseReleaseEvent暂时禁用加载。
我在单击滚动条时创建了一个信号,并将其连接到我的 QStyledItemDelegate。但是,封面在屏幕上“弹出”。
我想顺利显示,用QPropertyAnimation类(和 Animation Framework )。遗憾的是,QStyledItemDelegate、QIcon、QStandardItem 不是 QObject 也不是 QWidget,所以我不能使用 2 或 3 行代码来创建这种动画。
是否有解决方法或某种(不是那么丑陋的)黑客攻击?
我宁愿不覆盖 paintEvent 以在我的 QTreeView 中从头开始重新创建所有内容,因为这似乎很难做到,但也许我错了。
最佳答案
好吧,我没有找到使用 QPropertyAnimation 的正确方法,所以这里有一个更复杂的解决方案。
void LibraryScrollBar::mouseMoveEvent(QMouseEvent *e)
{
if (_hasNotEmittedYet) {
qDebug() << "hide covers when moving";
emit displayItemDelegate(false);
_hasNotEmittedYet = false;
}
QScrollBar::mouseMoveEvent(e);
}
void LibraryScrollBar::mouseReleaseEvent(QMouseEvent *e)
{
if (!_hasNotEmittedYet) {
qDebug() << "show covers when stopped moving";
emit displayItemDelegate(true);
_hasNotEmittedYet = true;
}
QScrollBar::mouseReleaseEvent(e);
}
void LibraryTreeView::init(LibrarySqlModel *sql)
{
/// some code before
LibraryScrollBar *vScrollBar = new LibraryScrollBar(this);
this->setVerticalScrollBar(vScrollBar);
connect(vScrollBar, &LibraryScrollBar::displayItemDelegate, [=](bool b) {
_itemDelegate->displayIcon(b);
b ? _timer->start() : _timer->stop();
});
connect(_timer, &QTimer::timeout, this, &LibraryTreeView::repaintIcons);
}
void LibraryTreeView::repaintIcons()
{
static qreal r = 0;
if (_timer->isActive()) {
r += 0.01;
_itemDelegate->setIconOpacity(r);
if (r >= 1) {
_timer->stop();
r = 0;
}
this->viewport()->repaint();
}
}
void LibraryItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
painter->save();
painter->setFont(Settings::getInstance()->font(Settings::LIBRARY));
QStandardItem *item = _libraryModel.data()->itemFromIndex(_proxy.data()->mapToSource(index));
QStyleOptionViewItem o = option;
initStyleOption(&o, index);
// Removes the dotted rectangle to the focused item
o.state &= ~QStyle::State_HasFocus;
int type = item->data(LibraryTreeView::Type).toInt();
switch (type) {
case LibraryTreeView::Album:
this->drawAlbum(painter, o, item);
break;
/// etc
}
painter->restore();
}
/** Albums have covers usually. */
void LibraryItemDelegate::drawAlbum(QPainter *painter, QStyleOptionViewItem &option, QStandardItem *item) const
{
static QImageReader imageReader;
static int coverSize = Settings::getInstance()->coverSize();
QString file = item->data(LibraryTreeView::DataCoverPath).toString();
// Display a light selection rectangle when one is moving the cursor
if (option.state & QStyle::State_MouseOver && ~option.state & QStyle::State_Selected) {
painter->save();
painter->setPen(option.palette.highlight().color());
painter->setBrush(option.palette.highlight().color().lighter(175));
painter->drawRect(option.rect.adjusted(0, 0, -1, -1));
painter->restore();
} else if (option.state & QStyle::State_Selected) {
// Display a not so light rectangle when one has chosen an item. It's darker than the mouse over
painter->save();
painter->setPen(option.palette.highlight().color());
painter->setBrush(option.palette.highlight().color().lighter(160));
painter->drawRect(option.rect.adjusted(0, 0, -1, -1));
painter->restore();
}
if (_showCovers) {
/// XXX: extract this elsewhere
// Qt::UserRole + 20 == false => pixmap not loaded ; == true => pixmap loaded
if (item->data(Qt::UserRole + 20).toBool() == false && !file.isEmpty()) {
FileHelper fh(file);
QFileInfo f(file);
qDebug() << "loading cover from harddrive";
// If it's an inner cover, load it
if (FileHelper::suffixes().contains(f.suffix())) {
std::unique_ptr<Cover> cover(fh.extractCover());
if (cover) {
QPixmap p;
p.loadFromData(cover->byteArray(), cover->format());
p = p.scaled(coverSize, coverSize);
item->setIcon(p);
item->setData(true, Qt::UserRole + 20);
}
} else {
imageReader.setFileName(QDir::fromNativeSeparators(file));
imageReader.setScaledSize(QSize(coverSize, coverSize));
item->setIcon(QPixmap::fromImage(imageReader.read()));
item->setData(true, Qt::UserRole + 20);
}
}
}
bool b = item->data(Qt::UserRole + 20).toBool();
if (_showCovers && b) {
QPixmap p = option.icon.pixmap(QSize(coverSize, coverSize));
QRect cover(option.rect.x() + 1, option.rect.y() + 1, coverSize, coverSize);
if (_animateIcons) {
painter->save();
painter->setOpacity(_iconOpacity);
painter->drawPixmap(cover, p);
painter->restore();
} else {
painter->drawPixmap(cover, p);
}
}
// It's possible to have missing covers in your library, so we need to keep alignment.
QPoint topLeft(option.rect.x() + coverSize + 5, option.rect.y());
QFontMetrics fmf(Settings::getInstance()->font(Settings::LIBRARY));
QRect rectText(topLeft, option.rect.bottomRight());
option.textElideMode = Qt::ElideRight;
QString s = fmf.elidedText(option.text, Qt::ElideRight, rectText.width());
painter->drawText(rectText, Qt::AlignVCenter, s);
}
关于c++ - 是否可以在 QStyledItemDelegate 中为 QIcon 的不透明度设置动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21331595/
我正在使用Qt 4.7。 我有一个模型,该模型在两列的QTableView中显示,我的目标是在QTableView中提供对该模型的内联编辑。 +-----------------+----------
我有一个代表MyDelegate用于QListWidget .委托(delegate)派生自 QStyledItemDelegate . MyDelegate 的目标之一是在ListWidget 的每
我有一个 QTreeWidget,我想通过使用样式委托(delegate)来完全自定义项目的外观。 我的主要问题是我想在我的项目右侧创建一个自定义按钮,它允许我折叠和展开该项目的子项。经典的“+”按钮
我得到了以下代码,我稍作修改,作为 how to use HTML formatted text in a QListWidget 的答案. main.ui Dialog
我目前正在尝试研究模型 View 方法并编写缩略图查看器应用程序。 在此示例中,我只是尝试绘制 20 个框,但我得到的似乎是随机选择,该选择会随着鼠标移动而更新。滚动使事情变得更糟,并且绘制有时只有框
我是 Python 和 PyQt5 的新手。我正在使用 QStyledItemDelegate 制作仅包含 ComboBox 的 QTableView 列之一。我设法显示了 ComboBox,但我在处
我创建了一个 QStyledItemDelegate 类,我想在其中使一些项目可检查,一些项目带有两个小部件。但它不能正常工作。我错过了什么?这是它的样子: 请看第 1 行,看起来两个小部件在那里,但
在我的一个项目中,我使用 QTableWidget 来显示一些复杂的计算结果。为了提高表格的可读性,我需要在单个表格单元格内显示两个对齐的值。 稍后我想通过使用颜色或箭头等进一步自定义小部件。 为此,
我正在使用 PySide2,但我找不到任何关于如何在 QStyledItemDelegate 子类中使用 paint() 函数的文档。我对类(class)相当陌生,但到目前为止可以理解,但在 PySi
我正在使用双调度创建一个样式化的 QTreeView 来解析数据项的特定委托(delegate),这非常有效。我对 QStyledItemDelegate 的委托(delegate)进行了子类化,以利
我想绘制一个遵循当前样式的自定义项目委托(delegate)。但“WindowsVista/7”风格和“WindowsClassic”风格在文本颜色上存在差异。 我使用以下代码来绘制背景(工作): v
我正在尝试使 QStyledItemDelegate 的行为类似于我编写的自定义 QWidget,因此我可以将我的代码切换到模型/ View 方法。 自定义 QWidget 是一个复杂的按钮,鼠标悬停
在我的项目中,我继承了 QStyledItemDelegate 并从 createEditor 函数返回了一个自定义编辑器。 QWidget* TagEditDelegate::createEdito
我有一个 QTableView,我正在为其设置自定义 QStyledItemDelegate。 除了自定义项绘制之外,我还想为选择/悬停状态设置行的背景色样式。我想要的外观类似于此 KGet 屏幕截图
我有一个 QStyledItemDelegate 派生对象用于 QTableView 派生 View 。我根据模型索引数据类型进一步委托(delegate)绘画和编辑器创建。对于 bool,我想通过复
我想在 QTableWidget 中显示两列,显示两个字符串之间的差异(之前由一些 Levenshtein 距离算法计算)。这些部分存储在每个 QTableWidgetItem 的数据中,作为 QSt
当鼠标悬停在项目委托(delegate)中的文本上时,如何更改鼠标图标?我有这部分,但我找不到任何更改鼠标指针的示例。 我错过了什么? void ListItemDelegate::paint(
我正在尝试使用 Qt,并希望根据模型的值以自定义文本颜色显示模型。以颜色呈现它是一个可选设置,所以我想避免在我的模型中使用 Qt::ForegroundRole,而是在 QStyledItemDele
我应该如何使用委托(delegate)更改我的树项目的背景颜色? 如果不在文本顶部绘画,我一直无法弄清楚如何做到这一点。换句话说,当我使用下面的代码时,颜色绘制在文本之上。文本在背景下... def
我试图使当前代码显示的所有内容都不可编辑。 之前的搜索都建议要么修改模型的flags()函数,要么使用表的setEditTriggers。我在这段代码中同时执行了这两项操作,但它们都不起作用。 查看逐
我是一名优秀的程序员,十分优秀!