【问题标题】:Qt4 Stylesheets and Focus RectQt4 样式表和焦点矩形
【发布时间】:2010-01-01 00:09:51
【问题描述】:

我想使用样式表 :focus 伪状态来控制树视图焦点状态的表示。使用以下样式表效果很好,除了 Qt 系统仍然绘制它自己的焦点矩形。我如何要求 Qt 不绘制焦点矩形,同时仍然能够集中控制键盘输入?

QTreeView {
    background: #505050;
    border: 1px solid;
    border-radius: 10px;
}

QTreeView:focus { 
    border: 2px groove;
}

【问题讨论】:

    标签: qt4 pyqt4


    【解决方案1】:

    围绕 QTreeView 小部件本身的焦点矩形原来是 Mac 样式功能。这将关闭每个小部件:

    tree.setAttribute(Qt.WA_MacShowFocusRect, 0)
    

    【讨论】:

      【解决方案2】:

      您可以使用树视图的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();
      }
      

      希望这会有所帮助,问候

      【讨论】:

      • @serge,感谢您提供有关 ItemDelegates 的重要信息。我遇到的第一个问题是我设计的整个 TreeView 周围有一个巨大的焦点蓝色矩形。
      • 我上传了一张截图来说明:techgame.net/~shane/temp/QTreeView-stylesheets.png
      • 我首先以为你想删除淹没在树视图项上的焦点矩形,但我猜你看到突出显示的是 QFocusFrame 淹没在你的控件被用于应用程序的样式中。它看起来像 QMacStyle 但我在这里可能是错的。我也无法在我的笔记本电脑上检查它,因为我正在运行 ubuntu。请看看我对原始帖子所做的更新是否适合您
      • @serge,原来是 Mac 独有的问题。 tree.setAttribute(Qt.WA_MacShowFocusRect, 0) 感谢您的帮助!
      【解决方案3】:

      我不知道您的问题的直接答案,但这里是我使用 qt 样式表自定义的树视图的代码 sn-p。也许它可以以某种方式帮助你。我相信 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; }") +
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        • 2017-06-23
        • 2013-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多