小编vic*_*ann的帖子

Qt5.6:高 DPI 支持和 OpenGL (OpenSceneGraph)

我有一个最小的应用程序,它使用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 状态已初始化。 …

opengl qt dpi openscenegraph qt5.6

6
推荐指数
1
解决办法
3274
查看次数

如何使用 Qt Creator 界面和设置传递 cmake 参数

我试图弄清楚如何使用 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表中。这些都不利于和我的应用程序失败,包括我定制QtWidgetsmain.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 文件的内容,只想让它在终端中构建时构建。

qt cmake qt-creator

4
推荐指数
1
解决办法
2253
查看次数

如何更改(删除)QListWidget 的选择/活动颜色

在我的中QListWidget,有一些项目具有非默认背景颜色,我在自定义QListWidget类中将它们设置如下:

item->setBackgroundColor(qcolor); // item is of type QListWidgetItem*
Run Code Online (Sandbox Code Playgroud)

我设置的那些非默认颜色会被 的QListWidget选择颜色扭曲。看一个例子:

在此输入图像描述

项目threefour应该是相同的颜色,但由于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,因此它将所有行设置为相同的颜色。

在这里尝试使用样式表来解决类似的问题,但没有成功,因此我得出结论,使用样式表不是正确的方法。

我最初使用的背景更改方法可以很好地满足我的目的,但我无法弄清楚如何摆脱默认选择颜色(透明浅蓝色),它会添加到背景颜色并产生混合颜色。

qt qlistwidget qt5 qpalette

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

QStyledItemDelegate:如何使复选框按钮在单击时更改其状态

我有一个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)

qt qcheckbox qstyleditemdelegate

3
推荐指数
2
解决办法
5403
查看次数

OpenGL:3D中厚而光滑/不折断的线条*

我有一个类似3D CAD的应用程序,我使用OpenGL包装器库(OpenSceneGraph).对于应用程序,我试图提出如何在3D中渲染粗细线条的最佳策略.

通过厚,光滑我的意思是:

  • 线条粗细可以超过OpenGL最大线宽值(它似乎10.f在我的机器上)
  • 在组成折线时,我想避免看到"折线"(见下面的示例图片)

OpenGL <code>GL_LINE_STRIP_ADJACENCY</code>.</p>

<p>我发现有很多不同的资源可以在2D中渲染漂亮的线条和曲线.最简单的方法是不需要太多思考就是将该行渲染为一组四边形(<code>GL_QUAD_STRIP</code>).这个解决方案的好处是它同时解决了我的两个问题.</p>

<p>作为一个例子,我还发现这个<a rel=漂亮的库可以实现广泛的线条和曲线外观.它使用三角形进行渲染.

注意:我不寻求像顶点着色或类似笔刷的笔触这样的奇特效果,只是一个3D线段,它可以具有较大的厚度,并且与另一个线段连接良好,它们之间没有任何间隙.

这些2D方法的问题在于它们是2D.当我改变视点时,很明显我的线条几何形状不是线条,而是2D"条带"位于某些3D平面中.我希望它们看起来像3D线条.

在考虑问题时,我只能提出以下方法:

  1. 将线渲染为一组2D四边形(三角形),然后使它们始终面向相机
  2. 使用像圆柱体这样的3D形状来表示线段

我不确定两种解决方案中的任何一种是否可行(我是OpenGL的初学者).我可能在场景中有数百甚至数千个折线.我也想知道是否有更好,更聪明的方法来解决这个问题?我对任何事情持开放态度,对最有效的方式感兴趣.谢谢.

编辑:正如用户@rickyviking指出的那样,我没有明确说明我正在寻找2D外观(就像任何类似CAD的应用程序一样),这意味着:线条的粗细不取决于距离的近/远相机就在他们身边.

更新:感谢@rickyviking的回答,我选择了方向移动 - 几何着色器.我仍然没有完整的解决方案,但可能会在结果发布后发布最终更新和最小代码.

opengl glsl openscenegraph

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