小编Eej*_*jin的帖子

向矢量添加多个值

我有一个int的向量,我想要添加多个值,但是太多的值要添加很多push_backs.是否有任何方法可以在向量的末尾添加多个值.有点像这样:

std::vector<int> values
values += {3, 9, 2, 5, 8, etc};
Run Code Online (Sandbox Code Playgroud)

我发现boost有类似的东西,但我不想包含boost.

#include <boost/assign/std/vector.hpp>

using namespace boost::assign;

{
    std::vector<int> myElements;
    myElements += 1,2,3,4,5;
}
Run Code Online (Sandbox Code Playgroud)

这似乎是这样声明的:

template <class V, class A, class V2>
inline list_inserter<assign_detail::call_push_back<std::vector<V,A> >, V> 
operator+=( std::vector<V, A>& c, V2 v )
{
    return push_back( c )( v );
}
Run Code Online (Sandbox Code Playgroud)

是否有任何C++/C++ 11方法可以做到这一点,如果没有,它将如何实现?

c++ vector addition

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

基于自动范围的结构化绑定与矢量

我试图循环一个元组的向量:

std::vector<std::tuple<int, int, int>> tupleList;
Run Code Online (Sandbox Code Playgroud)

通过使用基于范围的for循环与结构化绑定:

for (auto&& [x, y, z] : tupleList) {}
Run Code Online (Sandbox Code Playgroud)

但Visual Studio 2017 15.3.5给出了错误:

无法推断'auto'类型(需要初始化程序)

但以下确实有效:

for (auto&& i : tupleList) {
    auto [x, y, z] = i;
}
Run Code Online (Sandbox Code Playgroud)

这是为什么?

c++ c++17 structured-bindings

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

Qt在QTableview问题中自动完成QCombobox

我有一个QTableView,它有一个带有QComboBox QItemDelegate的列.有一个组合框的完成列表.当您开始输入并按Enter键时,完成正确完成(请注意大写字母)
在进入之前 (按回车) - > 在此输入图像描述

但是,当我按Tab键时,它不会包含大写字母.
在进入之前(按标签) - > 在此输入图像描述

但是当我在一个免费的ComboBox上尝试这个时,它会正确地自动完成
在此输入图像描述(按标签) - > 在此输入图像描述

我没有在任何地方捕获Tab输入事件,所以我不确定是什么导致了这个问题.会是什么呢?

c++ qt qtableview

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

Qt窗口大小不正确,直到用户事件

我正在创建一个屏幕,用户可以在其中添加某些图块以在编辑器中使用,但是在添加图块时,窗口无法正确调整大小以适应内容.除了当我拖动窗口或调整大小甚至一点点然后它立即捕捉到正确的大小.

在此输入图像描述
只需拖动窗口,它就会捕捉到正确的大小.

在此输入图像描述

我尝试使用resize(sizeHint()); 这给了我一个不正确的大小和以下错误,但在调整大小/拖动时仍然会发生正确大小的捕捉.

QWindowsWindow::setGeometry: Unable to set geometry 299x329+991+536 on QWidgetWindow/'TileSetterWindow'. Resulting geometry:  299x399+991+536 (frame: 8, 31, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 259x329, maximum size: 16777215x16777215).
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用updateGeometry()和update(),但它似乎没有做太多的事情.

将窗口设置为fixedSize时,它会立即调整大小,但用户无法再调整窗口大小.我在这里做错了什么,我在哪里开始解决它?

编辑 最小可验证示例.ui文件.selected_layout属于Flowlayout类型flowlayout_placeholder_1 仅在那里,因为我无法将flowlayout直接放入设计器中.

Edit2 这是一个最小的Visual Studio示例.我使用Visual Studio进行Qt开发.我尝试在Qt Creator中创建一个项目,但我没有让它工作.

Edit3 添加了一个小视频(80 KB).

Edit4 这是更新的Visual Studio示例.它有jpo38提出的新变化.它解决了调整错误的问题.虽然现在试图缩小窗口的尺寸会导致问题.如果您尝试减少水平空间,即使有更多行的空间,它们也不会正确填充垂直空间.

c++ qt qt-designer

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

Qt QPainter以毫米而不是英寸为单位

我有一个QPrinter可以直接打印A4到物理打印机或PDF.现在我想使用QPainter以毫米为单位绘制,但当前坐标系似乎是A4的宽度和高度,以英寸乘以打印机的分辨率.

8.26英寸×1200 res = 9912
11.69英寸×1200 res = 14028

我试过以下但是文字结果很大.

auto page = printer.pageRect(QPrinter::Unit::Millimeter);
painter.setWindow(QRect(0, 0, page.width(), page.height()));
Run Code Online (Sandbox Code Playgroud)

如何更改此设置,以便我的QPainter可以绘制到210 x 297 mm而不是上述系统?

这是在Windows 10和Qt 5.10上.

c++ printing qt transform

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

Qt MySQL 通过 SSL 连接到 Azure

我正在尝试使用 SSL 连接到 Azure MySQL 5.7,但遇到了一个似乎无法解决的错误。

连接适用于

  • mysql.exe
  • MySQL 工作台 8.0

连接不适用于

  • Qt
  • MySQL 连接器/C 8.0.18

我使用以下工作命令调用 mysql.exe

mysql.exe -h server.mysql.database.azure.com -u user@server -p --ssl

这会连接并且不会出现任何问题。MySQL Workbench 8.0 也能正常工作。

但是随后使用 Qt MySQL 插件进行连接会产生此错误。

SSL connection error: socket layer receive error

这是我用来连接的 Qt 代码

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

db.setHostName("server.mysql.database.azure.com");
db.setPort(3306);
db.setDatabaseName("databasename");
db.setUserName("user@server");
db.setPassword("password");
db.setConnectOptions("SSL_CA=C:/Users/User/Downloads/BaltimoreCyberTrustRoot.crt.pem");
if (!db.open()) {
    std::cout << db.lastError().text().toStdString() << "\n";   
}
Run Code Online (Sandbox Code Playgroud)

接下来我尝试使用 MySQL Connector/C(Qt 在下面使用)直接连接到 Azure 数据库。

MYSQL* mysql = mysql_init(nullptr);

char* t = "C:/Users/User/Downloads/BaltimoreCyberTrustRoot.crt.pem";

mysql_ssl_set(mysql, nullptr, nullptr, t, …
Run Code Online (Sandbox Code Playgroud)

mysql ssl qt azure mysql-connector

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

Qt文本大小以磅为单位

我正在尝试以A4为单位打印发票凭证,而不是默认的设备单位.除了将单位更改为毫米时,打印文档上的文本的分数不再与例如Word或Adobe Illustrator中的分数相匹配.我尝试将点大小转换为相应的像素大小,但它们存在问题.

QFont :: SetPixelSize只接受一个int,所以如果计算值低于1,它将转换为0

font.setPixelSize((9.0 * 72.0) / printer.resolution());
Run Code Online (Sandbox Code Playgroud)

而另一种方法使文本的垂直尺寸正确,但有一些文物:

int phys_w = printer.width();
font.setPointSizeF((9.0 / phys_w) * 210.0);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述
你可以在哪里看到一些角色之间异常大的差距.(也许在Qt中有一些精确的问题,它的文本绘图代码?)


这是一个显示问题的最小例子:

QPrinter printer(QPrinter::HighResolution);
printer.setPageSize(QPrinter::A4);
printer.setOrientation(QPrinter::Portrait);
printer.setFullPage(true);
printer.setPageMargins(QMarginsF(0, 0, 0, 0));

printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("invoice.pdf");

QPainter painter(&printer);

auto page_size = printer.pageRect(QPrinter::Unit::Millimeter);
painter.setWindow(page_size.toRect());

QFont font = painter.font();

// Either this
font.setPixelSize((9.0 * 72.0) / printer.resolution());

// or this
int phys_w = printer.width();
font.setPointSizeF((9.0 / phys_w) * 210.0);

painter.setFont(font);
painter.drawText(35, 46, "John Doe");
Run Code Online (Sandbox Code Playgroud)

如何以毫米(或任意单位)定位并使文本大小正确(或正确重新计算)?

这是在Qt 5.10.0和Windows 10上.

编辑 最后我选择了10倍的比例增加(十分之一毫米),这修复了setPointSizeF可见的字距调整问题.现在我对缩放的最后一个问题是设置一条线的宽度和其他形状(QPen :: setWidth),我找不到计算所以它以毫米为单位.

编辑 最后,线宽不需要任何重新计算.最终代码如下:

QPrinter …
Run Code Online (Sandbox Code Playgroud)

c++ qt text

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