假设您想要在迭代不提供随机访问迭代器的容器时知道元素的数字索引.例如:
std::list<std::string> items;
int i = 0;
for (auto & item : items) item += std::to_string(i++);
Run Code Online (Sandbox Code Playgroud)
是否有更惯用或更好的方式来做到这一点?我认为这种模式会出现在各种情况下.我不喜欢在循环之外可用的整数索引.包围循环和本地块中的索引定义似乎也很难看.
当然,当容器提供随机访问迭代器时,可以利用迭代器差异,但是你不能使用range-for:
std::vector<std::string> items;
for (auto it = items.begin(); it != items.end(); ++it)
*it += std::to_string(it - items.begin());
Run Code Online (Sandbox Code Playgroud)
虽然我只展示了C++ 11的例子,但我也在寻找C++ 0x和C++ 98的提示.
问题只是出于教育目的:
在两个对象(例如两个线程)之间使用30-50或更多对信号和插槽是否会影响应用程序性能,运行时或响应时间?
我需要将文本追加到QPlainTextEdit不添加新行的文本,但是这两种方法appendPlainText(),并appendHtml()实际上增加了新的段落.
我可以手动执行以下操作QTextCursor:
QTextCursor text_cursor = QTextCursor(my_plain_text_edit->document());
text_cursor.movePosition(QTextCursor::End);
text_cursor.insertText("string to append. ");
Run Code Online (Sandbox Code Playgroud)
这是有效的,但如果它在追加之前我还需要保持在底部滚动.
我试图从Qt的源文件副本的逻辑,但我坚持就可以了,因为那里实际上QPlainTextEditPrivate是使用类,我找不到这样做没有它的方法:比如说,我没有看到的方法verticalOffset()在QPlainTextEdit.
实际上,这些来源包含许多奇怪的东西(至少在初看起来),我不知道如何实现它.
以下是源代码append():http://code.qt.io/cgit/qt/qt.git/tree/src/gui/widgets/qplaintextedit.cpp#n2763
如何有效地缓存从表达式树编译的方法?
public void SomeToStringCalls()
{
ToString(i => (i + 1).ToString(), 1);
ToString(i => (i + 1).ToString(), 2);
ToString(i => (i + 2).ToString(), 3);
ToString(i => (i + 2).ToString(), 4);
}
private string ToString<T>(Expression<Func<T, string>> expression, T input)
{
var method = expression.Compile();
return method.Invoke(input);
}
Run Code Online (Sandbox Code Playgroud)
上面,每个调用都将重新编译每个表达式,即使某些表达式是相同的.我不能Dictionary<Expression<Func<T, string>>, Func<T, string>>()从表达式缓存已编译的方法,因为equals它将失败.
我有一组相当复杂的C++类,它们是用Java重写的.因此每个类都有一个继承的类,然后它还实现了一个或多个抽象类(或接口).
是否可以使用qobject_cast()从类转换为其中一个接口?如果我从中导出所有接口QObject,由于模糊QObject引用,我会收到错误.但是,如果我只继承了基类QObject,我就无法使用,qobject_cast()因为它与QObjects一起运行.
我希望能够在它们的接口引用的插件和DLL之间抛出类.
读了一些文章后,像这样关于Qt信号插槽通信还是有关于排队的连接问题.
如果我有一些线程一直向对方发送信号,并且假设一个thread_slow在它的事件循环中运行一个慢速方法而另一个thread_fast运行一个快速的方法发送多个信号,而另一个线程仍在运行它的慢速方法...... ..当thread_slow返回到事件循环的慢速方法时,它会处理之前发送的所有信号thread_fast还是最后一个发送的所有信号(所有信号都是相同的类型)?
如果它将处理所有信号,是否有办法使thread_slow 唯一的过程成为最后一个?(考虑到多线程应用程序中的"最后一个"可能是模糊的,让我们考虑线程要求最后一个信号之前的最后一个信号,为了简单起见,所以在线程查找最后一个时发送的新信号可能会丢失).
(我问这个是因为我有多个线程从多个线程接收数据,我不希望它们处理旧数据,只是最后一个发送的数据)
我已经进行了一些测试,看来Qt将处理所有信号.我做了一个线程:
while(true)
{
QThread::msleep(500);
emit testQueue(test);
test++;
}
Run Code Online (Sandbox Code Playgroud)
另一个插槽将执行:
void test::testQueue(int test)
{
test.store(private_test.load() + test);
emit testText(QString("Test Queue: ") + QString::number(private_test.load()));
}
Run Code Online (Sandbox Code Playgroud)
并且线程将运行:
while(true)
{
QThread::msleep(3000);
QCoreApplication::processEvents();
private_test.store(private_test.load() + 1000);
}
Run Code Online (Sandbox Code Playgroud)
我每隔500毫秒从一个线程向另一个线程发送一个信号,另一个线程休眠3000毫秒(3秒)然后唤醒并将内部变量递增100.每次执行一个插槽时它会发出一个文本收到的值+内部变量.我得到的结果是,每次 QCoreApplication::processEvents();调用,所有信号都被执行....(我编辑了这部分是因为我在之前的代码中发现了一个错误)
我目前在我的Qt应用程序中使用C++ 11功能.但是,我想在我的应用程序中使用一些新的C++ 14特性.
要在Qt应用程序中启用C++ 11,只需在qmake项目文件中添加一行,即:
CONFIG += c++11
Run Code Online (Sandbox Code Playgroud)
或者对于早期版本:
QMAKE_CXXFLAGS += -std=c++1y
Run Code Online (Sandbox Code Playgroud)
我已经尝试用C++ 14做同样的事情,但它没有用.我改变了上面提到的qmake项目的行,如下所示:
CONFIG += c++14
Run Code Online (Sandbox Code Playgroud)
或者对于早期版本:
QMAKE_CXXFLAGS += -std=c++1y
Run Code Online (Sandbox Code Playgroud)
之后,在尝试构建项目时出现了许多以前不存在的编译错误.该项目编译良好,但是,如果我尝试使用任何C++ 14功能,我会收到编译错误.这是一个例子:
template<typename T>
constexpr T pi = T(3.1415926535897932385);
Run Code Online (Sandbox Code Playgroud)
这是相应的错误:
main.cpp:7: error: template declaration of 'constexpr const T pi'
constexpr T pi = T(3.1415926535897932385);
^
Run Code Online (Sandbox Code Playgroud)
在QtCreator中使用qmake项目时如何启用C++ 14功能?
我使用的是Qt 5.3.2,Qt Creator 3.2.1和MinGW 4.8.2 32位.
我正在使用POI api.现在我的问题是我无法将单元格文本垂直对齐顶部.我正在使用getCellStyle().setAlignment(HSSFCellStyle.VERTICAL_TOP)设置对齐方式.
然而,当我打开表格时,它没有受到影响.
我有一个容器小部件.
它的尺寸政策是"固定的"(垂直和水平).它定义了setMaxmimumWidth和setMaximumHeight.
我在那里放了一个QHBoxLayout容器.添加小部件(具有固定的宽度/高度).但是,当我打电话给"显示"时,这一切都没有得到尊重.高度几乎是随机的,与布局中的任何内部小部件都不匹配,是最高项目大小的两倍,并且我的容器的宽度被拉伸远远超过我设置的固定宽度.
我错过了什么?为什么容器不能像我定义的那样保持固定的宽度/高度?为什么布局干扰它而不尊重它的约束?
我在qmake项目中遇到了包含问题.在我的.pro文件中,我得到了:
INCLUDEPATH += "C:\OpenCV\build\include"
Run Code Online (Sandbox Code Playgroud)
在我的cpp中:
#include <opencv\cv.h>
Run Code Online (Sandbox Code Playgroud)
编译器指示错误:
无法打开包含文件:'opencv\cv.h':没有这样的文件或目录
但如果我在我的cpp中写这个:
#include "C:\OpenCV\build\include\opencv\cv.h"
Run Code Online (Sandbox Code Playgroud)
有用!
我在Qt Creator中构建项目.我究竟做错了什么?