小编Inl*_*ine的帖子

如何在 Qt5 中将自定义小部件与模型/视图/委托一起使用?

在我当前使用的专有代码库中,有一个自定义列表视图(派生形式QListView)。

目前,当大量项目(> 10000)导致主线程冻结时,会出现问题。视图中的每个项目都是在 QtDesigner 中设计的自定义小部件。

为了渲染每一行,我们使用setIndexWidget,它在QAbstractItemModel::rowsInserted信号上调用。对于每个插入的行,为每个索引设置从first到自定义小部件。last

我尝试将此代码移植到 use QStyledItemDelegate,因为从实际模型中断开项目小部件似乎可以解决渲染缓慢的问题。

在这种情况下,Qt5 可以根据需要延迟渲染视图中的项目。在显示列表之前,我们不需要创建每个用于查看的小部件。

我使用派生自QStyledItemDelegate. 我在构造函数中创建一个列表项小部件,然后像这样覆盖绘制事件。

    void paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex &index) const override {
        auto baseWid = getBaseWidget(); // Get's list item widget pointer
        setSubEditorData(baseWid,index); // Set's it's state to display current item
        baseWid->resize(option.rect.size());
        QPixmap pixmap(option.rect.size());
        baseWid->render(&pixmap);
        painter->drawPixmap(option.rect, pixmap);
    }
Run Code Online (Sandbox Code Playgroud)

这对于静态内容来说已经足够了,但是我的小部件有复选框并且可以选择。

我真的不明白如何使其具有交互性,同时保留代表提供的好处(按需渲染等)。

我的问题是如何让委托处理用户事件?就像鼠标点击一样,选择也会发生变化。

涵盖委托的 Qt5 示例太简单了,我不明白如何使用委托绘制自定义小部件。

c++ qt qt5 qtwidgets

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

动态库中的 libstdc++ 静态链接

为了理解问题,我应该告诉您更多有关加载动态库的程序的信息。这是半条命专用服务器。它使用旧的 libstdc++,位于可执行文件旁边。\n为了避免出现问题,当使用新标准库中的功能时,我通常将我的项目静态链接到 libstdc++。

\n\n

我的朋友告诉我,如果加载 2 个使用不同编译器编译的库,或者当我从服务器调用函数时(这是在旧的 libstdc\xe2\x80\x8b++ 内部实现的),libstdc++ 静态链接可能会产生问题。

\n\n

这是真的吗?我该如何解决这个问题?

\n

c++ linux gcc c++11

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

Windows虚拟密钥代码

如何实现std::string VirtualKeyCodeToStdString(UCHAR key)返回虚拟键描述的功能?

示例:输入为VK_CAPITAL,返回值为std::string("Caps Lock")

c++ keyboard winapi key

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

为什么x86程序集中的第一个参数从偏移8开始?

我正在尝试加深对汇编语言的理解。我知道,当函数创建堆栈帧时,它将推送当前EBP值,而不是将堆栈指针值复制到EBP。第一个(也是唯一一个)功能参数由访问EBP + 8。但是为什么是8?推送后的下一个值在EBP逻辑上是偏移量4。我阅读了许多网页,但似乎我不明白这部分。

x86 assembly stdcall

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

用户定义的lambda演绎指南

今天我在努力学习C++模板.这是我在JNI代码中方便异常处理的简单代码.

template<typename T>
std::optional<T> handleNativeCrash(JNIEnv *env, std::function<T(void)> f) {
    try {
        return std::optional<T>(f());
    }
    catch (const std::exception &e) {
        jniThrowException(env, e.what());
        return {};
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用它而没有指定时T,Clang大致失败了这个错误

no matching function for call to 'handleNativeCrash'
      return my_namespace::handleNativeCrash(env, [&]{
             ^~~~~~~~~~~~~~~~~~~~~
  /......../jni.cpp:116:39)'
      std::optional<T> handleNativeCrash(JNIEnv *env, std::function<T(void)> f) {
                       ^
  1 error generated.
Run Code Online (Sandbox Code Playgroud)

我想T从lambda返回类型自动推断.我试着编写演绎指南,但似乎我无法为全局函数编写它.我试图创建只包含此函数的简单模板结构,但我也失败了.看来我并不真正理解C++模板元编程.

我的第一次尝试是这样的,但Clang只是抱怨非法语法并打印它的回溯.我会尽快报告错误,但我需要先完成这项工作.

template<typename T>
handleNativeCrash(JNIEnv *env, std::function<T(void)> f) -> handleNativeCrash<decltype(f())>;
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现目标?

c++ template-argument-deduction c++17

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

标签 统计

c++ ×4

assembly ×1

c++11 ×1

c++17 ×1

gcc ×1

key ×1

keyboard ×1

linux ×1

qt ×1

qt5 ×1

qtwidgets ×1

stdcall ×1

template-argument-deduction ×1

winapi ×1

x86 ×1