小编Nik*_*kin的帖子

C++枚举标志与bitset

枚举标志的使用位集的优缺点是什么?

namespace Flag {
    enum State {
        Read   = 1 << 0,
        Write  = 1 << 1,
        Binary = 1 << 2,
    };
}

namespace Plain {
    enum State {
        Read,
        Write,
        Binary,
        Count
    };
}

int main()
{
    {
        unsigned int state = Flag::Read | Flag::Binary;
        std::cout << state << std::endl;

        state |= Flag::Write;
        state &= ~(Flag::Read | Flag::Binary);
        std::cout << state << std::endl;
    } {
        std::bitset<Plain::Count> state;
        state.set(Plain::Read);
        state.set(Plain::Binary);
        std::cout << state.to_ulong() << std::endl;

        state.flip();
        std::cout << state.to_ulong() …
Run Code Online (Sandbox Code Playgroud)

c++ enums bitset

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

Nullify QString数据字节

我用QStrings来存储密码.如果更准确,我使用QStrings从GUI获取密码.关键是在密码使用/设备之后我需要QString用密码使内部s数据字节无效(零)以完全从内存中消除它.

这是我的调查:

  • QString破坏它的数据保留在内存中nonzeroed;
  • 当我尝试修改QString以使用零来实现它时,它会触发写时复制习惯用法并为修改后的数据变量分配新内存.旧数据保持不变.即使我使用QString::data()方法也是如此.不太确定为什么 - 可能是因为它不是原始的char *但是QChar *;
  • QString::clear(),= ""实际上与上述COW相同.

问:如何实施正确的QString清理以防止密码泄露?

c++ qstring qt

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

QTableView + QAbstractTableModel:通过拖放移动行

我有一个QAbstractTableModel基于简单的模型和一个QTableView

我的目标也很简单:允许通过拖放移动/重新排序行。笔记:

  • D'n'd里面的变化QTableView应该反映在我的模型中;
  • D'n'd 应该是内部的 - 移动应该只在我的视图内执行,没有外部 MIME 导出;
  • 我想拖放行。单独项目应该不会拖或丢弃;
  • 拖动水平标题对我来说不是一个合适的解决方案,因为我想要隐藏标题并且因为我想让用户在任何地方抓取行来拖动它;

我真的很接近我的目标。但它仍然没有像我预期的那样工作。现在我可以拖动行,但似乎任何单元格都可以接受拖放,尽管我Qt::ItemIsDropEnabled只为全局表的父级指定了此标志,并且没有为实际表项指定此标志,因为我不想拖放到它们,我想以某种方式删除“行之间”,只是为了执行行移动。因为表格项目出于某种原因可以接受删除,所以我得到了奇怪的行为:如果删除到任何行的第一个单元格,我就完全实现了我想要的:我的行移动正确。但是如果我掉到任何行的非第一个单元格,它就会完全错误。但最好展示一下这里发生的事情的图片:

在此处输入图片说明

我的代码(正是我的问题的最小样本):

主程序

void setupView(QTableView &t)
{
    t.verticalHeader()->hide();
    t.horizontalHeader()->hide();
    t.horizontalHeader()->setStretchLastSection(true);

    t.setSelectionBehavior(QAbstractItemView::SelectRows);
    t.setSelectionMode(QAbstractItemView::SingleSelection);

    t.setDragEnabled(true);
    t.setDropIndicatorShown(true);
    t.setAcceptDrops(true);
    t.viewport()->setAcceptDrops(true);
    t.setDefaultDropAction(Qt::MoveAction);
    t.setDragDropMode(QTableView::InternalMove);
    t.setDragDropOverwriteMode(false);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;

    QTableView *table = new QTableView(&w);
    setupView(*table);
    table->setModel(new TableModel);

    w.setCentralWidget(table);
    w.show();

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

表模型.cpp

#include "tablemodel.h" …
Run Code Online (Sandbox Code Playgroud)

c++ qt drag-and-drop qtableview qabstracttablemodel

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

C++严格别名不可知的演员

我已经在Stack Overflow中阅读了很多关于严格别名的QA,但它们都很常见,而且讨论总是倾向于引用C++标准的深层细节,这些细节几乎总是很难理解.特别是在标准时,不要直接说话,而是用泥泞不清楚的方式描述.所以,我的问题可能是这里有大量质量保证的重复,但是,请回答一个具体的问题:

这是做"nonalias_cast"的正确方法吗?:

template<class OUT, class IN>
inline auto nonalias_cast(IN *data) {
    char *tmp = reinterpret_cast<char *>(data);
    return reinterpret_cast<OUT>(tmp);
}

float f = 3.14;
unsigned *u = nonalias_cast<unsigned *>(&f);
*u = 0x3f800000;
// now f should be equal 1.0
Run Code Online (Sandbox Code Playgroud)

我猜答案是否定的.但是有什么好的解决方法吗?当然,除了禁用严格别名标志.联盟也不是一个方便的选择,除非有一种方法在nonalias_cast函数体内部适合联合黑客.memcpy这里也不是一个选项 - 数据更改应该是同步的.

一个不可能的梦想或一个难以捉摸的现实?

UPD:

好的,既然我们得到了一个否定答案"是否可能?" 问题,我想问你一个困扰我的额外问题:

将如何解决这个任务?我的意思是有很多实际的任务,更多的是要求"玩一点点"的方法.例如,假设您必须像这样编写IEEE-754浮点转换器.我更关注问题的实际方面:如何有一个解决方法来实现目标?至少在"#$ $的痛苦"方式.

c++ strict-aliasing

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

Qt-project是另一个Qt项目的git-submodule

我有一个Qt应用程序.它有一个.pro文件TEMPLATE = app.项目的子文件夹之一是另一个Qt项目的git-submodule:一个库的集合,它有自己的.pro文件TEMPLATE = subdirs.

图形上看起来像:

project/
    app.pro (TEMPLATE = app)
    stuff/
    libs/ <-- git-submodule
        libs.pro (TEMPLATE = subdirs)
        lib1/
            lib1.pro (TEMPLATE = lib)
        lib2/
            lib2.pro (TEMPLATE = lib)
Run Code Online (Sandbox Code Playgroud)

libs作为一个独立的项目编译好并生成.lib文件.但在这种情况下,我想以某种方式包括libs.proproject一个子目录,虽然app.proTEMPLATE不是subdirs,但app.也许这就是为什么我尝试写东西喜欢SUBDIRS += askelibapp.pro没有效果.总而言之,我的目标是获取.libbuild文件夹中的文件app.pro.我强调这libs是一个git-submodule,因为在libs项目内部不应该改变任何东西来实现我的目标.

我知道,如果我改变也许应该努力app.proTEMPLATEsubdirs.但这不是我真正想做的事情,因为它会使事情变得更加困难,因为项目层次结构将会达到另一个嵌套级别:

subdirs_proj/
    app/
    libs/
Run Code Online (Sandbox Code Playgroud)

代替

app/
    libs/ …
Run Code Online (Sandbox Code Playgroud)

qt qmake

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

Qt:从视图中删除模型

我们通常这样在Qt中设置视图的模型: view->setModel(model);

但是,有什么方法可以从视图中删除模型吗?我的意思是说,将视图保留为空,就像刚刚创建的那样,并且尚未设置任何模型。

如果您问我一个求婚的理由,那么我的情况与这个人的帖子非常相似。当第一个视图没有选择或者它是空的/无效的/什么的时候,我想让第二个视图从字面上什么都没有显示:没有标题,列,垃圾数据。在这种情况下,从视图中删除模型似乎非常合理。

我尝试了一个肮脏的技巧: *view = QTableView(); 但是Qt照顾了这些邪恶的东西,并将其operator=私有化。

c++ qt qabstractitemmodel qabstractitemview

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

C++成功的`try`分支

让我们考虑一些人为的C++代码:

int i = 0;

try { someAction(); }
catch(SomeException &e) { i = -1; }

i = 1;

... // code that uses i
Run Code Online (Sandbox Code Playgroud)

我想这个代码分配-1i的情况下someAction()抛出异常并分配1的情况下,如果没有例外.正如你现在所看到的,这段代码是错误的,因为i最终总是成为1.当然,我们可以做一些技巧解决方法,如:

int i = 0;
bool throwed = false;

try { someAction(); }
catch(SomeException &e) { throwed = true; }

i = throwed ? -1 : 1;

... // code that uses i
Run Code Online (Sandbox Code Playgroud)

我的问题是:C++中是否存在类似"成功尝试分支"的内容,如果在try块中没有任何抛出,我会做一些操作?就像是:

int i = 0;

try { someAction(); }
catch(SomeException …
Run Code Online (Sandbox Code Playgroud)

c++ try-catch

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