小编Mat*_*aus的帖子

在Visual Studio 2015中删除git映射

这个问题与git本身无关 ; 相反,它与删除绑定/映射到Visual Studio 2015(VS2015)之前看到的git存储库有关.

这是问题的屏幕截图: 删除按钮显示为灰色

请注意,删除按钮显示为灰色(禁用).如何从"本地Git存储库"列表中删除此条目?

git team-explorer visual-studio-2015

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

使用MSVC2017编译器在QtCreator中进行调试

我已经安装了Qt,但是在尝试从QtCreator中调试C++代码时遇到了错误.我在Windows上使用Visual Studio 2017,似乎没有安装QtCreator需要的调试器(cdb.exe).在使用MSVC2017编译器时,如何配置调试以在QtCreator中使用64位代码?

(我根据https://stackoverflow.com/help/self-answer回答我自己的问题.发布一个更好的答案,我会改变你接受的答案!)

c++ debugging qt qt-creator visual-studio-2017

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

Protobuf版本与Qt冲突

我正在尝试使用带有Qt 5.9.1的protobufs v 3.3.2.这适用于一些Qt应用程序,但仅限于它们是命令行程序.一旦我用Qt和protobufs创建GUI应用程序,我就会收到此错误:

[libprotobuf FATAL /home/mkraus/Documents/dev/star385/build/linux-desktop-debug-libs/protobuf/src/src/google/protobuf/stubs/common.cc:78] 该程序是针对2.6版编译的. Protocol Buffer运行时库中的1,与安装的版本(3.3.2)不兼容. 请与程序作者联系以获取更新.如果您自己编译了程序,请确保您的标题来自与链接时库相同的Protocol Buffers版本.("/build/mir-ui6vjS/mir-0.26.3+16.04.20170605/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc"中的版本验证失败.)

我应该澄清一下,我的部分代码肯定是使用版本3.3.2(我从git源下载和编译protobufs并静态链接).查看下面的堆栈跟踪,看看Qt正在引用的东西导致protobuf版本不匹配.

我正在开发Ubuntu 16.04并使用默认的桌面环境(Unity).

变通

我的故障排除揭示了这些症状和解决方法:

  • 使用KDE/KUbuntu.登录时更改桌面环境可以完全避免版本不匹配问题.

  • 运行Qt应用程序-platform eglfs.这使用OpenGL以全屏模式运行应用程序.程序运行,但窗口大小不正确.使用该-platform eglfs选项时,它甚至可以在Unity中运行,但如果没有此选项,它会给我上述错误.

  • 任何Qt应用程序都是命令行应用程序(使用QCoreApplication而不是QGuiApplication)可以使用protobufs 3.3.2.更改同一个应用程序以使用GUI会导致版本不匹配问题.

问题

如何在Qt GUI应用程序中使用protobufs 3.3.2,还不依赖于正在使用的桌面环境?Qt是否正在使用protobufs的2.6.1版本,如果是这样,编译Qt以使用protobufs 3.3.2是否可行?

调试信息

这是一个堆栈跟踪(程序在启动时几乎立即崩溃):

terminate called after throwing an instance of 'google::protobuf::FatalException'
  what():  This program was compiled against version 2.6.1 of the Protocol Buffer runtime library, which is not compatible with the installed version (3.3.2).  Contact the program author for an update.  If you compiled the program yourself, make …
Run Code Online (Sandbox Code Playgroud)

c++ ubuntu qt protocol-buffers qtwebengine

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

带有键盘数百万项的QListView

我正在使用一个QListView源自的自定义模型QAbstractItemModel.我有数百万件物品.我打电话listView->setUniformItemSizes(true)来阻止在向模型添加项目时调用一堆布局逻辑.到目前为止,一切都按预期工作.

问题是使用键盘导航列表很慢.如果我在列表中选择一个项目,然后按向上/向下,选择将快速移动,直到选择需要滚动列表.然后变得非常迟钝.按向上翻页或向下翻页也非常滞后.问题似乎是当使用键盘选择项目(也就是"当前项目")时,列表也会向上/向下滚动.

如果我使用鼠标,导航列表很快.我可以使用快速的鼠标滚轮.我可以按照我想要的速度向上/向下拖动滚动条 - 从列表顶部到底部 - 列表视图快速更新.

关于为什么改变选择和滚动列表的组合如此缓慢的任何想法?有可行的解决方案吗?

2015年9月9日更新

为了更好地说明问题,我在此更新中提供了放大信息.

KEYBOARD + SCROLLING的性能问题

这主要是性能问题,尽管它确实与用户体验(UX)有关.看看当我使用键盘滚动浏览时会发生什么QListView:

慢滚动问题

注意底部附近的减速?这是我的问题的焦点.让我解释一下我如何浏览列表.

说明:

  1. 从顶部开始,选择列表中的第一个项目.
  2. 按下并保持向下箭头键,当前项(选择)更改到下一个项目.
  3. 对于当前查看的所有项目,快速更改选择.
  4. 一旦列表需要将下一个项目放入视图中,选择速率就会显着降低.

我希望列表能够像键盘的打字速度一样快地滚动 - 换句话说,选择下一个项目所花费的时间不应该在滚动列表时减慢.

使用MOUSE快速滚动

这是我使用鼠标时的样子:

快速鼠标导航

说明:

  1. 使用鼠标,我选择滚动条手柄.
  2. 快速向上和向下拖动滚动条手柄,相应地滚动列表.
  3. 所有动作都非常快.
  4. 请注意,没有选择.

这证明了两个要点:

  1. 模型不是问题.如您所见,该模型在性能方面没有任何问题.它可以比显示元素更快地传递元素.

  2. 选择和滚动时性能会降低.选择和滚动的"完美风暴"(如使用键盘在列表中导航所示)导致减速.因此,我推测,在滚动期间正常执行的选择时,Qt以某种方式进行了大量处理.

非Qt实施是快速的

我想指出,我的问题似乎与Qt有关.

在使用不同的框架之前,我已经实现了这种类型的东西.我想做的是在模型 - 视图理论的范围内.我可以使用带有juce :: ListBox的juce :: ListBoxModel以极快的速度完成我所描述的内容.这是愚蠢的快速(此外,当每个项目已经具有唯一索引时,不需要为每个项目创建重复索引,例如a ).我认为Qt需要针对其模型 - 视图架构的每个项目,虽然我不喜欢开销成本,但我认为我理性,我可以忍受它.无论哪种方式,我都不怀疑这些因素导致我的表现减慢.QModelIndexQModelIndexQModelIndex

通过JUCE实现,我甚至可以使用向上翻页和向下翻页键来导航列表,它只是在列表中闪现.使用Qt QListView实现,即使使用发布版本,它也会突然出现并且很迟钝.

使用JUCE框架的 …

c++ qt qlistview qabstractitemmodel model-view

7
推荐指数
1
解决办法
2100
查看次数

使用 QWidget::render() 绘制绘制其他小部件的小部件(自定义paintEvent)

我使用 Qt 和 C++ 创建一个名为 ThumbnailView 的自定义小部件,它允许向左/向右滚动缩略图:

class ThumbnailView : public QWidget {
public:
  virtual void paintEvent(QPaintEvent *);
private:
  QList<Thumbnail*> thumbList;
};
Run Code Online (Sandbox Code Playgroud)

ThumbnailView 保留 Thumbnail 对象的内部列表,这些对象也是 QWidget 对象:

class Thumbnail : public QWidget
{
public:
   virtual void paintEvent(QPaintEvent *);
};
Run Code Online (Sandbox Code Playgroud)

我将 ThumbnailView 嵌入到我创建的 PreviewPane 对象中:

class PreviewPane : public QWidget {
public:
  virtual void paintEvent(QPaintEvent *);
private:
  ThumbnailView thumbnailView;
};
Run Code Online (Sandbox Code Playgroud)

当主应用程序加载时,我创建一个停靠小部件并添加 PreviewPane:

previewPaneDock = new QDockWidget(QString("PREVIEW"), this);
previewPane     = new PreviewPane;
previewPaneDock->setWidget(previewPane);
this->addDockWidget(Qt::RightDockWidgetArea, previewPaneDock, Qt::Vertical);
Run Code Online (Sandbox Code Playgroud)

所以想法是这样的:停靠小部件将其小部件设置为previewPane,它反过来通过paintEvent()和所有鼠标事件(我在这里省略了)处理自定义绘画。PreviewPane 的paintEvent 执行以下操作:

void PreviewPane::paintEvent(QPaintEvent …
Run Code Online (Sandbox Code Playgroud)

c++ qt qwidget

5
推荐指数
1
解决办法
9258
查看次数

从内存而不是URL动态加载QML

是否可以从内存中动态加载QML而不是使用文件?我见过很多总是需要URL的代码,如下所示:

QGuiApplication app(argc, argv);
QQmlEngine* engine = new QQmlEngine;
QQmlComponent component(engine, QUrl(QStringLiteral("qrc:/main.qml")));

// ignoring error checking (make sure component is ready, compiles w/o errors, etc)

QObject* object = component.create();
app.exec();
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,main.qml将加载,QML的神奇之处将确保任何类型得到解决.特别是,Qt认为文件的名称是QML类型,它可用于同一目录中的任何其他QML文件.因此,如果main.qml使用该类型Simple,它将查找该文件Simple.qml并将其用作类型定义(http://doc.qt.io/qt-5/qtqml-documents-definetypes.html).

现在我将变得危险:我想使用内存中的QML而不是使用文件.这是它可能工作的方式(请忽略糟糕的设计,内存泄漏等):

QByteArray SimpleQml()
{
    return QByteArray("import QtQuick 2.7; Text {") +
        "text: \"Hello, World!\"}";
}

QByteArray TextExampleQml()
{
    return QByteArray("import QtQuick 2.7; Simple{") +
        "color: \"Red\"}";
}

QObject* createObjectFromMemory(QByteArray qmlData, QQmlEngine* engine, QQmlComponent* componentOut)
{
    componentOut = new QQmlComponent(engine); …
Run Code Online (Sandbox Code Playgroud)

c++ qt qml

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