标签: qwidget

在QWidgetDelegate的paint()方法中为QListView渲染QWidget

我在实现自定义窗口小部件渲染时遇到困难QListView.我目前有一个QListView显示我的自定义模型PlayQueue基于QAbstractListModel.

这对于简单的文本工作正常,但现在我想为每个元素显示一个自定义小部件.所以我将a子类化为QStyledItemDelegate实现这样的paint方法:

void QueueableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
    if (option.state & QStyle::State_Selected)
        painter->fillRect(option.rect, option.palette.highlight());
    QWidget *widget = new QPushButton("bonjour");
    widget->render(painter);
}
Run Code Online (Sandbox Code Playgroud)

正确呈现选择背景但不显示小部件.我尝试使用QPainterQt示例中的简单命令,这很好用:

void QueueableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
    if (option.state & QStyle::State_Selected)
        painter->fillRect(option.rect, option.palette.highlight());
    if (option.state & QStyle::State_Selected)
        painter->setPen(option.palette.highlightedText().color());
    painter->setFont(QFont("Arial", 10));
    painter->drawText(option.rect, Qt::AlignCenter, "Custom drawing");
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试了一些改变:

  • 更改QStyledItemDelegateQItemDelegate
  • 添加painter->save()和 …

qt qwidget qpainter qlistview qstyleditemdelegate

12
推荐指数
2
解决办法
1万
查看次数

使用任何c ++函数作为Qt插槽

有没有办法将任何C++函数用作Qt插槽,而不使其类继承自QWidget?

c++ qt signals-slots qwidget

12
推荐指数
2
解决办法
1万
查看次数

获取在应用程序中创建的所有QObject的列表

要获取在应用程序中创建的所有QWidget的列表,我们可以简单地调用QApplication::allWidgets().

我已经阅读了文档,并且我没有找到这样的内容来获取所有QObject的列表.如果应用程序创建不是QWidgets的独立QObject,我就没有这样的功能可供使用.

有没有办法获得这样的清单?

qt qwidget qobject

11
推荐指数
1
解决办法
2465
查看次数

单击时在QWidget上绘制矩形叠加层

在我的项目中,我使用了一个EventFilter用于小部件的小部件QHBoxLayout.

如果我点击一个小部件,我想在点击的小部件上绘制一个蓝色的透明覆盖.有没有办法实现这个?

问候

qt qwidget

11
推荐指数
1
解决办法
2万
查看次数

有没有办法将QWidget添加到QtCreator中的QMenu

我创建一个文本编辑器,我想放QComboBoxQMenu.我没有在QMenu处理这样的事情中找到任何方法.最接近的是QMenu::addAction().我想知道绕过这个障碍.

谢谢!

c++ qt qwidget qmenu

10
推荐指数
1
解决办法
7925
查看次数

如何创建QWidget的截​​图?

我在Qt Creator的作业中工作,在那里我画到QWidget,我需要保存这个QWdiget的一部分.

我试图解决这个问题:

 QPixmap pixmap;
 pixmap.copy(rectangle); // rectangle is part of QWidget, which I need to save
 pixmap.save("example.png");
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

qt save qwidget qpixmap

10
推荐指数
2
解决办法
1万
查看次数

如何将QWindow放入QWidget的布局(Qt5)

我想在一些小部件布局中将QQuickView插入我的旧qt4应用程序.如何在单个应用程序中混合使用QWidget和QWindow?

有什么例子吗?

c++ qt qwidget qt5

10
推荐指数
1
解决办法
5363
查看次数

如何获取小部件背景QColor

我试图找出的背景颜色QWidgetQGLWidget使我可以用它qglClearColor()做了OpenGL部分的小部件中出现原生(无例如黑色背景).

我想我可以获取backgroundRole()我的小部件,但我在将其转换为a时遇到问题QColor.有QPalette::color(QColorRole),但它不是静态的,我不知道我怎么会要创建的实例QPalette做了改造.

qt qwidget

10
推荐指数
1
解决办法
1万
查看次数

如何防止QWidget绘画,但仍然可以响应事件?

我有一个QGLWidget在Qt应用程序中呈现OpenGL场景.我想添加一些覆盖在其上的半透明Qt小部件QGLWidget.这比标准小部件更难,因为OpenGL绘图上下文对于Qt的画家类是未知的.因此,如果我只是做了明显的事情并在QGLWidget例如顶部放置一个透明工具栏,则工具栏的透明部分将呈现黑色(绘制时无法访问OpenGL帧缓冲区).

似乎处理此类事情的推荐方法是在绘制OpenGL场景后重绘2D内容.只要您只是绘制简单的形状,链接的示例似乎非常简单.相反,我想要做的是推迟绘制一些子QWidget对象的绘画,以便在绘画事件中完成QGLWidget.

所以,我的问题归结为:

  1. 防止叠加QWidget在正常的2D上下文中绘制.
  2. 在绘制事件处理程序中,在QGLWidget绘制构成背景的3D场景后绘制叠加层.

这个列表中的第二项似乎很简单:我可以QWidget::render()QGLWidget绘图事件中使用在视口顶部绘制所需的小部件.这很好用.

第一项更棘手:我需要一种方法来阻止小部件在正常的事件过程中绘画,并且只在QGLWidget油漆处理程序中绘制它们.一个显而易见的方法是使用隐藏叠加层QWidget::hide().这允许我按照我的意愿在OpenGL场景上绘制小部件.但是,由于窗口小部件是隐藏的,因此它们不响应鼠标或键盘事件.作为一个例子,我使用了一个QToolBar带有几个按钮,工具栏被正确绘制,但是没有功能(没有一个按钮响应点击).因此,如果沿着这条路走下去,似乎我需要一种方法来强制小部件仍然响应事件,即使它是隐藏的.

我尝试过的另一种方法是QToolBar使用事件过滤器拦截绘制事件,目的是阻止工具栏自行绘制.但是,工具栏仍然呈现; 我假设这是因为工具栏上的各种按钮都是仍然绘制的子窗口小部件,即使我拦截了父级的绘制事件.

关于我可以实现目标的方式的任何想法?

opengl qt paint qwidget

10
推荐指数
1
解决办法
7369
查看次数

Mac OS X上的QWidget没有关注Qt 5.x.

我有QSystemTrayIcon和QAction打开QWebView类型的新窗口.当窗口失去焦点并再次选择QAction时,窗口应重新获得焦点.它在Linux上运行,但在Mac OS X上没有.问题是,当我有另一个窗口打开并处于活动状态时,让我们说Google Chrome,当我在我试图打开的窗口上调用show()时,它总是在谷歌浏览器下打开,所以我没有看到它.聚焦时也是如此,当我打开多个窗口时,我的QWebView可能是订单中的最后一个,当我点击QAction聚焦窗口时,它将始终位于谷歌浏览器窗口下.我的猜测是,当我单击QAction时,它是我的应用程序进程的一部分,它将尝试打开/聚焦窗口,但在操作过程中,由于QSystemTrayIcon无法保持焦点,因此Google Chrome窗口会被安排并获得焦点.因此,当窗口被打开/聚焦时,它不会从谷歌Chrome中窃取焦点,因为操作系统不允许它,因此它将被置于当前聚焦的窗口下.

在这里我如何创建/聚焦窗口:

// ...
QPointer<QWebView> view;
// ...

void TrayIcon::webView() {
  if (!this->view) {
    this->view = new QWebView();
    this->view->load("http://example.com");
    this->view->show();
  } else {
    this->view->activateWindow();
    this->view->raise();
  }
}
Run Code Online (Sandbox Code Playgroud)

有什么我做错了或有任何已知的解决方法?

c++ macos qt qwidget qt5

10
推荐指数
2
解决办法
2245
查看次数