我想使用样式表 :focus 伪状态来控制树视图焦点状态的表示。使用以下样式表效果很好,除了 Qt 系统仍然绘制它自己的焦点矩形。我如何要求 Qt 不绘制焦点矩形,同时仍然能够集中控制键盘输入?
QTreeView {
background: #505050;
border: 1px solid;
border-radius: 10px;
}
QTreeView:focus {
border: 2px groove;
}
围绕 QTreeView 小部件本身的焦点矩形原来是 Mac 样式功能。这将关闭每个小部件:
tree.setAttribute(Qt.WA_MacShowFocusRect, 0)
您可以使用树视图的setItemDelegate方法为树视图项目设置自定义绘制过程。在 deligate 的绘制方法中,您可以从项目选项中删除 QStyle::State_HasFocus 样式并执行基本绘制例程。下面是一个例子,抱歉是c++。
...
NoFocusDelegate* delegate = new NoFocusDelegate();
ui->treeView->setItemDelegate(delegate);
...
class NoFocusDelegate : public QStyledItemDelegate
{
protected:
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
};
void NoFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const
{
QStyleOptionViewItem itemOption(option);
if (itemOption.state & QStyle::State_HasFocus)
itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
QStyledItemDelegate::paint(painter, itemOption, index);
}
update0:使用自定义 QStyle 对象删除 QFocusFrame 以免淹没在 TReeView 上。下面是应用于应用程序对象的自定义 QMotifStyle 样式后代(我猜在您的情况下我猜它应该是 QMacStyle 后代)的示例。每当检测到 qtreeview 小部件时,它都不会进行任何框架矩形绘制
class MyStyle1 : public QMotifStyle
{
public:
MyStyle1()
{
//???
}
void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget = 0 ) const
{
if (element==CE_FocusFrame)
{
const QFocusFrame* frame = qobject_cast<const QFocusFrame*>(widget);
if (frame && frame->widget())
{
QTreeView* treeView = qobject_cast<QTreeView*>(frame->widget());
if (treeView)
{
qDebug() << "no CE_FocusFrame for QFocusFrame over QTreeViews";
return;
}
}
}
QMotifStyle::drawControl(element, option, painter, widget);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QCDEStyle style;
a.setStyle(new MyStyle1());
//a.setStyle(new QMotifStyle());
MainWindow w;
w.show();
return a.exec();
}
希望这会有所帮助,问候
我不知道您的问题的直接答案,但这是我使用 qt 样式表自定义的树视图的代码片段。也许它可以以某种方式帮助你。我相信show-decoration-selected属性是启用默认焦点绘制的原因(可能是错误的,因为我被它愚弄了一段时间)
QString treeview_ss = "QTreeView { color: white; background: black; }" +
QString("QTreeView { show-decoration-selected: 0; }") +
QString("QTreeView::item:selected { border: 1px solid grey; }") +
QString("QTreeView::item:selected:!active { color: white; border: 1px solid grey; background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #000000, stop: 1 grey); }") +
QString("QTreeView::item:selected:active { border: 1px solid grey; background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #000000, stop: 1 grey); }") +
QString("QTreeView::item:hover { border: 1px solid grey; }") +