小编mik*_*ike的帖子

为什么 QObject ::findChildren 返回具有公共基类的子级?

我使用 QObject 作为复合模式的基类。

假设我有一个父类 File(在一个人为的示例中),我向其中添加不同类型的子类 HeaderSection 和 PageSection。File、HeaderSection 和 PageSection 都是节。Section 的构造函数采用一个父对象,该对象被传递到 QObject 的构造函数,设置父对象。

例如:

class Section : public QObject {
 Q_OBJECT

 // parent:child relationship gets set by QObject
 Section(QString name, Section *parent=NULL) : QObject(parent)
 { setObjectName(name);}
 QString name(){return objectName();}
};

class File: public Section {
public:
 // probably irrelevant to this example, but I am also populating these lists
 QList<Section *> headers;
 QList<Section *> pages;
};

class Header : public Section {
Header(QString name, File *file) : Section(name, file){} …
Run Code Online (Sandbox Code Playgroud)

c++ qt qobject

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

如何在没有焦点的情况下更新 QDataWidgetMapper 项目

我有几个 QLineEdit,每个 QLineEdit 通过它们自己的 QDataWidgetMapper 连接到一个 QStandardItemModel,以便它们都反映相同的值。

如果用户在一个 QLineEdit 中输入一个值,那么这非常有效 - 当 QLineEdit 失去焦点时,模型会更新并且所有其他 QLineEdit 显示相同的值。

但是,我想通过 QLineEdit::setText 设置一个 QLineEdit 中的值,这不会使 QLineEdit 失去焦点。我可以手动调用 QDataWidgetMapper 上的提交,但这需要设置对该映射器的访问权限,如果我可以帮助它,我宁愿避免它,因为它在另一个类中。

有没有办法在 QLineEdit 中设置文本,就像用户输入了文本一样,例如,以便 QDataWidgetMapper 提交?

c++ qt

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

QwtPlotBarChart - 如何获得匹配条形中点的标签

QwtPlotBarChart用来绘制直方图.我已经设置了图表,以便条形之间没有间距,我的xBottom轴具有实际的数据范围.

样品在图表上使用a QVector设置QPointF,x值对应于箱的中点.

一个QwtPlotPicker盘旋在酒吧表明,他们开始并在实际开始和垃圾箱的两端结束.

但是,我无法获得绘制标签的刻度线,以便沿x轴在正确的位置显示.我正在使用自定义scaledraw,类似于distrowatch示例.我还有一些参数,即数据范围的最小值和bin大小.我的标签索引代码如下所示:

virtual QwtText label( double value ) const
{
    QwtText lbl;

    //const int index = qRound( value );
    const int index = (int)(value-_min_val)/_bin_size;
    if ( index >= 0 && index < d_labels.size() )
    {
        lbl = d_labels[ index ];
    }

    return lbl;
}
Run Code Online (Sandbox Code Playgroud)

这似乎没问题; 我的标签显示每个箱子的最小值和最大值以及几乎在正确的位置.我试图设置滴答位置如下:

QwtScaleDiv div = _plot->axisScaleDiv(QwtPlot::xBottom);
div.setTicks(QwtScaleDiv::MajorTick, x_data.toList());
_plot->setAxisScaleDiv(QwtPlot::xBottom, div);
Run Code Online (Sandbox Code Playgroud)

x_data是用于绘制数据的bin中点的向量.轴范围使用以下方式设置:

double half_bin = bin_size / 2.0;
_plot->setAxisScale(QwtPlot::xBottom, x_data.first() - …
Run Code Online (Sandbox Code Playgroud)

c++ qt qwt

5
推荐指数
0
解决办法
200
查看次数

QT更新值信号/插槽的最佳实践

您认为设计信号/插槽交互以更新类中的成员值的最佳做法是什么?

例如,考虑在UI上表示的成员变量.用户更改UI中的值.存在信号/槽关系以通过成员变量更新功能自动更新成员变量.

我们还希望在UI上自动更新成员变量的更改,因此另一种方式存在信号/插槽关系.在通过更新功能更新成员变量时,信号触发UI更新.

你如何防止这些成为循环?它是否像调用成员变量更新函数时检查新值与当前值一样简单,如果存在差异,仅发送信号以更新UI?

或者......有更优雅的方式吗?

qt signals slot

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

如何在 Vulkan 中重新分配缓冲区

Vulkan 中推荐的内存管理方法是对缓冲区进行子分配,例如参见下图。

我正在尝试实施“好的”方法。我有一个系统可以告诉我内存分配中的哪个位置可用,因此我可以绑定单个大缓冲区的子区域。但是,我找不到执行此操作的机制,或者只是误解了正在发生的事情,因为绑定函数将缓冲区作为输入和偏移量。除了通过现有缓冲区,我看不到如何指定绑定的大小。

所以我想有几个问题:

  • 下图中的虚线矩形只是绑定,还是额外的缓冲区?
  • 如果它们是绑定,我如何告诉 Vulkan(理想情况下使用 VMA)使用缓冲区的该部分?
  • 如果它们是额外的缓冲区,我该如何创建它们?
  • 如果两者都不是,它们是什么?

我已经阅读了一些自定义分配器,但它们似乎遵循“坏”方法,将偏移量返回到大型分配中以进行绑定,因此仍然有大量缓冲区但分配计数较低。需要明确的是,除了通过 VMA 之外,我没有使用自定义分配器回调;我上面提到的“系统”位于 VMA 调用之上。

任何指针非常感谢!

这里

c++ memory vulkan

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

在函数中使用const指向类

我在代码中大量使用std :: shared_ptr.我有一些函数,我想从MyClass使用"this"调用,所以已声明这些函数(例如)

int AnotherClass::foo(const MyClass *obj)
{
} 
Run Code Online (Sandbox Code Playgroud)

我希望const明确表示obj不会被改变,因为我传递了一个原始指针.但是,我有内心

int AnotherClass::foo(const MyClass *obj)
{
    int number = obj->num_points()-1;
}
Run Code Online (Sandbox Code Playgroud)

并且我的编译器抱怨"该对象具有与成员函数不兼容的类型限定符".num_points是在标头中声明和定义的简单get函数:

class MyClass {
public:
  ...
  int num_points(){return _points.size();}
  ...
private:
  std::vector<MyPoint> _points;
};
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?显然我可以摆脱foo中的const要求,但我喜欢它强加的刚性.提前谢谢了!

c++ const shared-ptr

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

如何在 google 测试中读取 spdlog 输出

我正在执行 spdlog 的最新提交(存在有关 std 输出的问题,显然已解决),并且正在将我的输出从 std::cout 切换到 spdlog。

我的谷歌测试重定向 std::cout 所以我可以检查存根函数的输出:

class MyTest : public testing::Test
{
protected:
        void SetUp() override
        {            
            sbuf = std::cout.rdbuf();
            std::cout.rdbuf(buffer.rdbuf());
            auto console = spdlog::stdout_color_mt("console");
            auto err_logger = spdlog::stderr_color_mt("stderr");            
        }
        void TearDown() override
        {
            std::cout.rdbuf(sbuf);         
        }
        std::stringstream buffer;
        std::streambuf* sbuf;
}
Run Code Online (Sandbox Code Playgroud)

然后在测试中使用如下;

doSomethingThatWritesToStdOut();
std::string teststr = buffer.str();
EXPECT_TRUE(teststr.find("Some output string") != std::string::npos);
Run Code Online (Sandbox Code Playgroud)

doSomethingThatWritesToStdOut当我将内容更改为时,这不起作用

spdlog::get("console")->debug("Some output string\n");

teststr值为空..如果我执行以下操作

 spdlog::get("console")->debug("Some output string\n");
 std::cout << "Some output string\n";
Run Code Online (Sandbox Code Playgroud)

然后我可以在 teststr.txt 中看到“某些输出字符串”的一个实例。如何捕获此记录器的输出(或更改记录器)以便我可以在谷歌测试中进行测试?

c++ googletest spdlog

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

Qt从库中调用QApplication :: exec

这是我提出的关于在遗留C应用程序中嵌入Qt代码的问题的后续内容.

我能够将Qt代码构建到我的C应用程序中,并且惊讶地发现我甚至可以在我用来执行此操作的静态库中运行gui代码.(顺便说一句,我的C应用程序也是GUI驱动的).这开辟了一些令人兴奋的可能性,我试图让两个GUI并排工作.

我现在的问题是,为了启动Qt GUI代码,我需要调用QApplication :: exec(),这有效地阻止了我的应用程序的其余部分,因为它直到我杀死qt gui才返回.

有什么方法可以启动qt gui代码并仍然返回我的主机应用程序?

我很欣赏我可以将我的Qt代码作为一个不同的进程启动并实现一些进程间通信,但重点是尝试将其嵌入为库.

在任何人建议之前,我也无法在Qt中托管遗留应用程序!

谢谢你的帮助!

c c++ user-interface qt

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

标签 统计

c++ ×7

qt ×5

c ×1

const ×1

googletest ×1

memory ×1

qobject ×1

qwt ×1

shared-ptr ×1

signals ×1

slot ×1

spdlog ×1

user-interface ×1

vulkan ×1