我在实现自定义窗口小部件渲染时遇到困难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)
正确呈现选择背景但不显示小部件.我尝试使用QPainter
Qt示例中的简单命令,这很好用:
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)
所以我尝试了一些改变:
QStyledItemDelegate
到QItemDelegate
painter->save()
和 …有没有办法将任何C++函数用作Qt插槽,而不使其类继承自QWidget?
要获取在应用程序中创建的所有QWidget的列表,我们可以简单地调用QApplication::allWidgets()
.
我已经阅读了文档,并且我没有找到这样的内容来获取所有QObject的列表.如果应用程序创建不是QWidgets的独立QObject,我就没有这样的功能可供使用.
有没有办法获得这样的清单?
在我的项目中,我使用了一个EventFilter
用于小部件的小部件QHBoxLayout
.
如果我点击一个小部件,我想在点击的小部件上绘制一个蓝色的透明覆盖.有没有办法实现这个?
问候
我创建一个文本编辑器,我想放QComboBox
的QMenu
.我没有在QMenu
处理这样的事情中找到任何方法.最接近的是QMenu::addAction()
.我想知道绕过这个障碍.
谢谢!
我在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)
谢谢你的帮助.
我想在一些小部件布局中将QQuickView插入我的旧qt4应用程序.如何在单个应用程序中混合使用QWidget和QWindow?
有什么例子吗?
我试图找出的背景颜色QWidget
或QGLWidget
使我可以用它qglClearColor()
做了OpenGL部分的小部件中出现原生(无例如黑色背景).
我想我可以获取backgroundRole()
我的小部件,但我在将其转换为a时遇到问题QColor
.有QPalette::color(QColorRole)
,但它不是静态的,我不知道我怎么会要创建的实例QPalette
做了改造.
我有一个QGLWidget
在Qt应用程序中呈现OpenGL场景.我想添加一些覆盖在其上的半透明Qt小部件QGLWidget
.这比标准小部件更难,因为OpenGL绘图上下文对于Qt的画家类是未知的.因此,如果我只是做了明显的事情并在QGLWidget
例如顶部放置一个透明工具栏,则工具栏的透明部分将呈现黑色(绘制时无法访问OpenGL帧缓冲区).
似乎处理此类事情的推荐方法是在绘制OpenGL场景后重绘2D内容.只要您只是绘制简单的形状,链接的示例似乎非常简单.相反,我想要做的是推迟绘制一些子QWidget
对象的绘画,以便在绘画事件中完成QGLWidget
.
所以,我的问题归结为:
QWidget
在正常的2D上下文中绘制.QGLWidget
绘制构成背景的3D场景后绘制叠加层.这个列表中的第二项似乎很简单:我可以QWidget::render()
在QGLWidget
绘图事件中使用在视口顶部绘制所需的小部件.这很好用.
第一项更棘手:我需要一种方法来阻止小部件在正常的事件过程中绘画,并且只在QGLWidget
油漆处理程序中绘制它们.一个显而易见的方法是使用隐藏叠加层QWidget::hide()
.这允许我按照我的意愿在OpenGL场景上绘制小部件.但是,由于窗口小部件是隐藏的,因此它们不响应鼠标或键盘事件.作为一个例子,我使用了一个QToolBar
带有几个按钮,工具栏被正确绘制,但是没有功能(没有一个按钮响应点击).因此,如果沿着这条路走下去,似乎我需要一种方法来强制小部件仍然响应事件,即使它是隐藏的.
我尝试过的另一种方法是QToolBar
使用事件过滤器拦截绘制事件,目的是阻止工具栏自行绘制.但是,工具栏仍然呈现; 我假设这是因为工具栏上的各种按钮都是仍然绘制的子窗口小部件,即使我拦截了父级的绘制事件.
关于我可以实现目标的方式的任何想法?
我有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)
有什么我做错了或有任何已知的解决方法?