【问题标题】:Changing cursor shape for QComboBox items更改 QComboBox 项目的光标形状
【发布时间】:2017-06-13 14:49:04
【问题描述】:

我想为QComboBox 和他的项目设置光标形状。 setCursor 仅影响 LineEdit 的一部分 QComboBox,如何访问项目视图以更改光标形状?

QComboBox *combo = new QComboBox();
combo->addItem("One");
combo->addItem("Two");
combo->addItem("Three");
combo->setCursor(Qt::PointingHandCursor); // changes cursor only for LineEdit part, on popup cursor is still arrow
combo->view()->setCursor(Qt::PointingHandCursor); // does not affect popup view

我们使用 Qt 5.5.1

【问题讨论】:

  • 您是否尝试在 view()->viewport() 上进行设置,这是鼠标所在的实际小部件?也许视口会覆盖弹出窗口的光标。
  • @JohannesSchaub-litb 好主意,也许 view() 确实不是小部件,尝试使用 combo->view()->viewport()->setMouseTracking(true); combo->view()->viewport()->setCursor(Qt::PointingHandCursor); 得到相同的结果。这很奇怪,因为我能够通过这样的样式表访问项目:QComboBox QAbstractItemView::item { color: red;} 并弹出本身QComboBox QAbstractItemView {}。但是尝试更改光标形状时会遇到很多麻烦
  • @JohannesSchaub-litb 有趣的是,如果我在 combo->view()->viewport() 上安装 eventFilter,我确实会收到所有 mouveMove 和 mouseHover 事件,但它无法为它安装光标 combo->view()->viewport()->setCursor(Qt::PointingHandCursor);

标签: c++ qt qt5 qcombobox qcursor


【解决方案1】:

此代码有效:

combo->installEventFilter(this);
//...

bool MainWin::eventFilter(QObject *obj, QEvent *ev)
{
    if( obj == combo 
        && (ev->type() == QEvent::Enter
        || ev->type() == QEvent::HoverMove) )
    {
        combo->setCursor(Qt::PointingHandCursor);
        combo->view()->setCursor(Qt::PointingHandCursor);

        return true;
    }
    return QMainWindow::eventFilter(obj, ev);
}

Qt Event Filters

【讨论】:

  • 对于我的 win 10 机器,我在返回 qDebug() << "event type: " << ev->type(); 之前添加了一行,我在日志中收到各种事件,但是当我展开组合框的项目时,事件停止在日志中弹出。对我来说,组合框项目的光标没有改变
  • 试试combo->setMouseTracking(true); combo->view()->setMouseTracking(true);
  • 我通过combo->view()->viewport()->installEventFilter(this); 将弹出窗口中的鼠标移动事件更改为obj == mCategoryCBox->view()->viewport()。现在,当我移动鼠标并在弹出窗口中选择不同的项目时,我确实得到了鼠标移动事件。但是当我尝试更改 view() 、 viewport() 或组合本身的光标时,没有任何效果。有趣的是 - 我实际上在日志中收到了event type: QEvent::Type(CursorChange),但我的箭头光标仍然存在:D
  • 你也可以试试your_win->setCursor(),QApplication::setOverrideCursor()...这也可能是一个bug,所以你可以尝试将Qt版本更改为最新版本,或更改为具有次要更新(例如 5.6.2)
猜你喜欢
  • 2021-07-19
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
相关资源
最近更新 更多