我有一个最小的应用程序,它使用QOpenGLWidget集成了 OpenGL 包装器库 (OpenSceneGraph)。我试图弄清楚在处理像我使用的 OpenGL 内容时如何正确使用 Qt5.6 对高 DPI 屏幕的支持。
我的main()函数有以下代码:
int main(int argc, char** argv)
{
// DPI support is on
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
QMainWindow window;
// QOpenGLWidget with OpenSceneGraph content
QtOSGWidget* widget = new QtOSGWidget();
window.setCentralWidget(widget);
window.show();
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
将QtOSGWidget源自QOpenGLWidget与OpenSceneGraph的内容:我使用的osgViewer::GraphicsWindowEmbedded渲染我简单的场景。
为了将 OSG 与 Qt 合并,我重新定义了*GL()方法:paintGL(),resizeGL()和initializeGL(). 我遵循 Qt 文档,了解每种*GL()方法应包含的内容,即:
paintGL() 确保查看器已更新resizeGL() 确保正确调整图形窗口的大小(连同相机和视口);initializeGL() 确保 OpenGL 状态已初始化。 …我试图弄清楚如何使用 Qt Creator 的设置并传递一些 CMake 参数。假设我有一个可以使用终端构建的应用程序,如下所示:
cmake .. -DQTDIR=/home/myCustomBuildStuff
-DLD_LIBRARY_PATH=/home/myCustomBuildStuff
-DCMAKE_INCLUDE_PATH=/home/myCustomBuildStuff/include
# etc.
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用的是我的自定义构建的 Qt(以及其他一些库)。当我使用终端构建时,一切正常。
但现在我想尝试使用 Qt Creator 并使用 Qt Creator 设置传递所有 CMake 参数。
我尝试使用可在套件中找到的CMake 配置设置。我尝试修改Build Settings,并将我的参数直接添加到上面的Build Steps和/或CMake表中。这些都不利于和我的应用程序失败,包括我定制QtWidgets的main.cpp:
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5:-1: error:
version 'Qt_5.9' not found (required by home/myCustomBuiltStaff/bin/uic)
Run Code Online (Sandbox Code Playgroud)
在上面的错误中,路径显然是错误的(需要在/home/myCustomBuiltStuff/文件夹中搜索)。但是如何使用 Qt Creator 设置传递该路径?
请注意,当我将所有路径作为参数传递给 CMake 时,我无法触及 CMake 文件的内容,只想让它在终端中构建时构建。
在我的中QListWidget,有一些项目具有非默认背景颜色,我在自定义QListWidget类中将它们设置如下:
item->setBackgroundColor(qcolor); // item is of type QListWidgetItem*
Run Code Online (Sandbox Code Playgroud)
我设置的那些非默认颜色会被 的QListWidget选择颜色扭曲。看一个例子:
项目three和four应该是相同的颜色,但由于four选择了该项目,因此它们不是相同的颜色,因此结果颜色是原始颜色和QListWidget的选择(活动项目?)颜色的总和。
我的问题是如何编辑或删除该选择颜色?
我在我的内部尝试过QListWidget(当我想更改项目的背景颜色时在特殊插槽中):
QPalette pal = this->palette();
pal.setColor(QPalette::Highlight, QColor(255,255,255,0));
this->setPalette(pal); // updated
Run Code Online (Sandbox Code Playgroud)
但并没有产生任何效果。我究竟做错了什么?设置的变量是否正确?QListWidget我是在其委托内部还是在其委托内部设置它?
更新:我尝试使用评论/答案所指出的样式表,但是,不可能将它们用于我的应用程序,因为我行中的项目有 3 种状态(所以我需要使用三种颜色)。例如,3 个状态对应于三种颜色:粉色表示活动,绿色表示不活动,灰色表示其余。使用样式表时,我无法将自定义属性(比方说QListWidget::item[Inactive="true"])设置为 single QListWidgetItem,但对于 full QListWidget,因此它将所有行设置为相同的颜色。
在这里尝试使用样式表来解决类似的问题,但没有成功,因此我得出结论,使用样式表不是正确的方法。
我最初使用的背景更改方法可以很好地满足我的目的,但我无法弄清楚如何摆脱默认选择颜色(透明浅蓝色),它会添加到背景颜色并产生混合颜色。
我有一个MyDelegate用于QListWidget. 委托派生自QStyledItemDelegate. 的目标之一MyDelegate是在ListWidget. 它是在以下paint()事件中完成的MyDelegate:
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyledItemDelegate::paint(painter, option, index);
// ... drawing other delegate elements
QStyleOptionButton checkbox;
// setting up checkbox's size and position
// now draw the checkbox
QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkbox, painter);
}
Run Code Online (Sandbox Code Playgroud)
起初我认为复选框会在单击时自动更改其状态,因为我指定了QStyle::CE_CheckBox. 但事实并非如此。看起来我必须手动指定复选框的视觉行为。
数据方面,当用户单击该复选框时,会发出某些信号并更改场景数据。我在editorEvent()以下位置执行此操作:
bool MyDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
if (event->type() == QEvent::MouseButtonRelease) { …Run Code Online (Sandbox Code Playgroud) 我有一个类似3D CAD的应用程序,我使用OpenGL包装器库(OpenSceneGraph).对于应用程序,我试图提出如何在3D中渲染粗细线条的最佳策略.
通过厚,光滑我的意思是:
10.f在我的机器上)
漂亮的库可以实现广泛的线条和曲线外观.它使用三角形进行渲染.
注意:我不寻求像顶点着色或类似笔刷的笔触这样的奇特效果,只是一个3D线段,它可以具有较大的厚度,并且与另一个线段连接良好,它们之间没有任何间隙.
这些2D方法的问题在于它们是2D.当我改变视点时,很明显我的线条几何形状不是线条,而是2D"条带"位于某些3D平面中.我希望它们看起来像3D线条.
在考虑问题时,我只能提出以下方法:
我不确定两种解决方案中的任何一种是否可行(我是OpenGL的初学者).我可能在场景中有数百甚至数千个折线.我也想知道是否有更好,更聪明的方法来解决这个问题?我对任何事情持开放态度,对最有效的方式感兴趣.谢谢.
编辑:正如用户@rickyviking指出的那样,我没有明确说明我正在寻找2D外观(就像任何类似CAD的应用程序一样),这意味着:线条的粗细不取决于距离的近/远相机就在他们身边.
更新:感谢@rickyviking的回答,我选择了方向移动 - 几何着色器.我仍然没有完整的解决方案,但可能会在结果发布后发布最终更新和最小代码.