我使用 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) 我有几个 QLineEdit,每个 QLineEdit 通过它们自己的 QDataWidgetMapper 连接到一个 QStandardItemModel,以便它们都反映相同的值。
如果用户在一个 QLineEdit 中输入一个值,那么这非常有效 - 当 QLineEdit 失去焦点时,模型会更新并且所有其他 QLineEdit 显示相同的值。
但是,我想通过 QLineEdit::setText 设置一个 QLineEdit 中的值,这不会使 QLineEdit 失去焦点。我可以手动调用 QDataWidgetMapper 上的提交,但这需要设置对该映射器的访问权限,如果我可以帮助它,我宁愿避免它,因为它在另一个类中。
有没有办法在 QLineEdit 中设置文本,就像用户输入了文本一样,例如,以便 QDataWidgetMapper 提交?
我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) 您认为设计信号/插槽交互以更新类中的成员值的最佳做法是什么?
例如,考虑在UI上表示的成员变量.用户更改UI中的值.存在信号/槽关系以通过成员变量更新功能自动更新成员变量.
我们还希望在UI上自动更新成员变量的更改,因此另一种方式存在信号/插槽关系.在通过更新功能更新成员变量时,信号触发UI更新.
你如何防止这些成为循环?它是否像调用成员变量更新函数时检查新值与当前值一样简单,如果存在差异,仅发送信号以更新UI?
或者......有更优雅的方式吗?
Vulkan 中推荐的内存管理方法是对缓冲区进行子分配,例如参见下图。
我正在尝试实施“好的”方法。我有一个系统可以告诉我内存分配中的哪个位置可用,因此我可以绑定单个大缓冲区的子区域。但是,我找不到执行此操作的机制,或者只是误解了正在发生的事情,因为绑定函数将缓冲区作为输入和偏移量。除了通过现有缓冲区,我看不到如何指定绑定的大小。
所以我想有几个问题:
我已经阅读了一些自定义分配器,但它们似乎遵循“坏”方法,将偏移量返回到大型分配中以进行绑定,因此仍然有大量缓冲区但分配计数较低。需要明确的是,除了通过 VMA 之外,我没有使用自定义分配器回调;我上面提到的“系统”位于 VMA 调用之上。
任何指针非常感谢!
我在代码中大量使用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要求,但我喜欢它强加的刚性.提前谢谢了!
我正在执行 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应用程序中嵌入Qt代码的问题的后续内容.
我能够将Qt代码构建到我的C应用程序中,并且惊讶地发现我甚至可以在我用来执行此操作的静态库中运行gui代码.(顺便说一句,我的C应用程序也是GUI驱动的).这开辟了一些令人兴奋的可能性,我试图让两个GUI并排工作.
我现在的问题是,为了启动Qt GUI代码,我需要调用QApplication :: exec(),这有效地阻止了我的应用程序的其余部分,因为它直到我杀死qt gui才返回.
有什么方法可以启动qt gui代码并仍然返回我的主机应用程序?
我很欣赏我可以将我的Qt代码作为一个不同的进程启动并实现一些进程间通信,但重点是尝试将其嵌入为库.
在任何人建议之前,我也无法在Qt中托管遗留应用程序!
谢谢你的帮助!