我想绘制具有各种宽度边框的形状.
如果我设置width = 0,我希望(想象)这里没有边框......但我读到边框0非常薄("化妆品")边框.
如何用隐形边框绘制形状?
int penWidth = 0; // some user input, 0 to 20 maybe
QPen pen = QPen(Qt::red, penWidth, Qt::PenStyle(Qt::SolidLine));
painter->setPen(pen);
painter->setBrush(QBrush(Qt::SolidPattern));
painter->drawRect(someRect);
Run Code Online (Sandbox Code Playgroud) 我想为某些对象实现自定义行为.
为此,让我的项目(继承自QGraphicsItem)实现一些接口.
class SomeParentItem
{
SomeParentItem(bool x) { x = true; }
void function1() {}
};
class SomeInterface
{
virtual void function2() = 0;
};
class XYZItem : public QGraphicsXYZItem, public SomeParentItem, public SomeInterface
{
XYZItem(bool x):SomeParentItem(x) {}
virtual void function2() { x = false; }
};
class MPQItem : public QGraphicsMPQItem, public SomeParentItem
{
MPQItem (bool x):SomeParentItem(x) {}
};
Run Code Online (Sandbox Code Playgroud)
从外面看,我以为我就是这么做的
SomeInterface* item1 = dynamic_cast<SomeInterface*>(item);
if(item1 == NULL)
item->function1();
else
item1->function2();
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会崩溃...通常......所以我正在创建一个标志来测试,如果标志是真的,那么只有敢于施放.
但我一直在想,它不应该崩溃.所以我勇敢再次尝试,这次是在一个QWidget孩子.而不是崩溃我得到了
QWidget::insertAction: Attempt to insert null action
Run Code Online (Sandbox Code Playgroud)
这是 …
我试图找出如何使用Google Test运行单元测试,并将结果发送到TeamCity.
我已经运行了测试,并使用命令行参数将结果输出到xml --gtest_output="xml:test_results.xml".
我想在TeamCity中读取这个xml.我没有看到如何 在构建/运行期间将XML报告传递给TeamCity ...
除了通过XML报告处理:
我添加了XML Report Processing,添加了Google Test,然后......它要求我指定监控规则,并添加了xml文件的路径......我不明白监控规则是什么,或者如何创建它们. ..
[尽管如此,我在生成的xml中看不到任何地方,它打算与TeamCity交谈...]
在日志中,我有:
Google Test report watcher
[13:06:03][Google Test report watcher] No reports found for paths:
[13:06:03][Google Test report watcher] C:\path\test_results.xml
[13:06:03]Publishing internal artifacts
Run Code Online (Sandbox Code Playgroud)
当然,没有报告结果.
任何人都可以指导我以正确的方式将xml测试结果文件导入TeamCity吗?非常感谢 !
编辑:XML报表处理是否可能只处理在构建期间创建的报表?(谷歌测试没有做什么?)并忽略了以前生成的报告,"过时",只是说它找不到它们 - 或者格式错误,或者......但是我应该阅读上面的消息?
我想测试一个寻找特定垫深度和通道数的函数
它有一个测试......
if (image.channels() == 1 && image.depth() == 8) ...
else if (image.channels() == 1 && image.depth() == 16) ...
else if (image.channels() == 1 && image.depth() == 32) ...
else
{
if ((image.channels() != 3) || (image.depth() != 8))
{printf("Expecting rgb24 input image"); return false;}
...
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢用化妆垫进行测试,以避免使用本地资源:
cv::Mat M(255, 255, CV_8UC3, cv::Scalar(0,0,255));
printf("M: %d %d \n", M.channels(), M.depth());
cv::Mat M1(255, 255, CV_32F, cv::Scalar(0,0,255));
cv::Mat M2(255, 255, CV_32FC3, cv::Scalar(0,0,255));
cv::Mat M2(255, 255, CV_8SC3, cv::Scalar(0,0,255));
Run Code Online (Sandbox Code Playgroud)
我已经尝试了各种组合,但如果我打印,我得到0深度.
我也尝试加载一个png或一个jpg文件 - 结果相同(我不喜欢使用外部文件......但我看不出为什么这不起作用) …
我试图混合两个图像.如果它们具有相同的大小,则很容易,但如果其中一个图像更小或更大,则cv :: addWeighted失败.
图像A(预计会更大)图像B(预计会更小)
我试图创建一个ROI - 尝试创建一个大小为A的第三个图像并将B复制到其中 - 我似乎无法正确使用它.请帮忙.
double alpha = 0.7; // something
int min_x = ( A.cols - B.cols)/2 );
int min_y = ( A.rows - B.rows)/2 );
int width, height;
if(min_x < 0) {
min_x = 0; width = (*input_images).at(0).cols - 1;
}
else width = (*input_images).at(1).cols - 1;
if(min_y < 0) {
min_y = 0; height = (*input_images).at(0).rows - 1;
}
else height = (*input_images).at(1).rows - 1;
cv::Rect roi = cv::Rect(min_x, min_y, width, height);
cv::Mat …Run Code Online (Sandbox Code Playgroud) 我无法理解如何应用缩放和旋转QGraphicsItem.
我需要能够应用旋转和缩放(不一定保持纵横比),我得到完全意想不到的结果.
旋转必须在项目中心周围.我似乎没有问题 - 但如果我尝试调试边界矩形,我看似错误的值.
如果我不保持纵横比,而不是旋转,我得到一个非常奇怪的偏斜,我一直在努力寻找原因并纠正它.我希望任何人都能找到解决方案.
对于许多项目 - 比如矩形 - 我的解决方案是放弃调整大小 - 只需用给定大小的新项目替换项目. 我甚至为pixmap做了这个(尽管它可能会影响性能).
但我不知道如何为文本或其他一些类型(svg ...)做到这一点.
我试图了解如何应用缩放,旋转项目,以及如何正确应用它.
下面的代码是一个实验,我可以缩放和旋转文本项目,结果...参见附图
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsTextItem>
void experimentScaling(QGraphicsScene* s)
{
QGraphicsTextItem* ref = new QGraphicsTextItem(); // a reference, not resized
ref->setPlainText("hello world");
s->addItem(ref);
ref->setDefaultTextColor(Qt::red);
ref->setRotation(45);
QGraphicsTextItem* t = new QGraphicsTextItem(); // text item to be experimented on
t->setPlainText("hello world");
s->addItem(t);
QTransform transform; // scale
transform.scale(10, 1);
t->setTransform(transform);
t->update();
QPointF _center = t->boundingRect().center();
qDebug("%f %f %f %f", t->boundingRect().left(), …Run Code Online (Sandbox Code Playgroud) 我需要创建具有文本内容的确切宽度和高度的文本项.
文本的高度是最重要的要求.
文本的位置应该与文本本身相关.
我还必须能够将它放在画布上的确切位置.
假设一个(可打印的)画布(在一个更大的画布上QGraphicsScene),比如5英寸宽和1英寸高,我的文字应该能够从上下左右拉伸 - 并且放在画布上,而不是部分画出.
我正在QGraphicsTextItem为我的项目类型进行子类化.我正在调整大小,使用QTransform()所需的大小 - 以英寸或毫米或像素(72*英寸)为单位.
同时将document()边距设置为0,内部的任何内容(如QTextBlockFormat边距)也设置为0.
我已经实现了setItemSize(QSizeF sz)(以像素为单位的sz),QGraphicsTextItem根据需要调整大小.
使用项目边界rect初始化sz.
假设没有换行,单行文本(解决此问题后可以单独解决多行).
将项目添加到画布时,我仍然会看到顶部和底部边距 - 这会根据字体选择而有所不同.
我在项目周围画了一个矩形来看它.
顶部/底部距离取决于字体选择.
我曾尝试使用字体指标来确定这些距离(paint()我在绘制线条时试图确定文本适合的位置和矩形).
我很乐意至少能够确定用于大写字母,没有重音符号或特殊字符字体的正确大小(这将是一个开始,但自然我需要能够使用任何字符).
但至少有一些方法可以确定文本内容的大小和位置(相对于项目的(0,0)),即使在最简单的情况下......
字体度量tightBoundingRect()似乎是最准确的大小,但似乎无法确定其位置,以便我可以以某种方式正确创建我的项目,并可能正确调整大小/移动它们以适应画布.
以下是我努力确定至少相对于项目的(0,0)的文本的确切大小和位置的一些示例(假设一旦我这样做,我能够将该信息暴露给外部或包括班次在项目转换调整大小).
请注意,字体度量标注的文本大小并不总是覆盖文本,对于不同的字体,我无法在文本本身周围放置紧束缚矩形(洋红色).(我做了多次猜测,下面的代码只有一个 - 这些行试图显示不同的字体指标大小).
以上是继承文本项的绘画功能的实验QGraphicsTextItem:
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
// draw text
QGraphicsTextItem::paint(painter, option, widget);
QPen p;
p.setWidthF(0);
QFontMetricsF fm(this->font());
qreal ascent = fm.ascent(),
descent = fm.descent(), …Run Code Online (Sandbox Code Playgroud) 我想设计一个QGroupBox符合某些设计要求的样式:
注意 - 顶部的组标题应位于左侧,但应超过框曲率.
使用以下样式表,我得到下面的图像(如果我删除单词"left",则为第二个图像):
QGroupBox {
font: bold;
border: 1px solid silver;
border-radius: 6px;
margin-top: 6px;
}
QGroupBox::title {
subcontrol-origin: margin;
subcontrol-position: top left; // for second image: top;
padding: 0 2px 0 2px;
}
Run Code Online (Sandbox Code Playgroud)
所以,看起来我想要的subcontrol-position: top left;只是增加了偏移量.我找不到任何地方.
添加填充会删除该行,因此它不是我想要的.
我刚才找到了一个选项 - 一个不同的选项subcontrol-origin::
QGroupBox::title {
subcontrol-origin: padding;
subcontrol-position: top left;
padding: -16 12px 0 12px;
}
Run Code Online (Sandbox Code Playgroud)
它看起来几乎是正确的 - 但边界现在切入标题.
如何移动组合框的标题,使其仍然在左侧但是超过框曲率,并且曲率保持可见,例如在设计中?
我正在使用openssl,在构建期间我收到了很多关于缺少libeay.pdb的警告.有人可以建议如何添加它吗?
build.cmd看起来像这样(我认为重要的部分):
...
perl util\mk1mf.pl debug dll no-asm VC-WIN64A >ms\ntdll64.dbg.mak
perl util\mkdef.pl 32 libeay > ms\libeay32.def
nmake -f ms/nt64.dbg.mak
Run Code Online (Sandbox Code Playgroud)
我读了INSTALL.W32,上面写着"如果你使用平台debug-VC-WIN32而不是VC-WIN32,那么将编译调试符号." 我试图用debug-WIN64A替换VC-WIN64A(与32相同),并且构建给了我一个错误
Unknown option --debug-VC-WIN64A
Run Code Online (Sandbox Code Playgroud)
谢谢.
编辑:当我在mak之后添加/ DEBUG
再次编辑时它起作用:/ DEBUG不是必需的,命令中的调试字完成了工作.
如何使用Visual Studio构建它?
我正在运行启动流程的Qt应用程序(Qt助手)
当应用程序在OSX上运行时,进程窗口显示在调用者窗口后面...
我怎么能把它带到前面?
Qt文档中的代码:
QProcess *process = new QProcess();
QStringList args;
args << QLatin1String("-collectionFile")
<< QLatin1String("mycollection.qhc");
//<< QLatin1String("-enableRemoteControl"); // can't use this, help freezes... but still starts in background! ... this is apparently a bug in Qt solved in Qt 5.4 (see Note) which I cannot use, but not relevant for current problem
process->start(QLatin1String("Assistant.app"), args);
if (!process->waitForStarted())
return;
Run Code Online (Sandbox Code Playgroud)

关于不使用"-enableRemoteControl"的注意事项 - 请参阅问题
标记为重复/投票的闭合点指向以分离方式启动进程的示例.尝试它并没有解决问题 - 此外,帮助必须是应用程序的子进程.
根据评论/发布的答案更新:
试
QString app = "path/to/Assistant"; // since I use the copy from inside …Run Code Online (Sandbox Code Playgroud)