我要疯了.我在ScrollView中有一个ListView,连接到一个继承QAbstractListModel的模型.将对象添加到模型时,ListView使用委托显示它们.到现在为止还挺好.
但我真的希望视图保持滚动到底部(就像聊天窗口一样),而且我很难实现这一点.这是相关的QML代码:
Rectangle {
ScrollView {
[anchor stuff]
ListView {
id: messageList
model: textMessageFiltered
delegate: messageDelegate
}
}
TextField {
id: messageEditor
[anchor stuff]
onAccepted: {
controller.sendTextMessage(text)
text = ""
/* This works. */
//messageList.positionViewAtEnd();
}
}
Component {
id: messageDelegate
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
color: "white"
height: nameText.height + 4
Text {
id: nameText
wrapMode: Text.Wrap
text: "<b>" + authorName + " (" + authorId + ")</b> " + message
[anchor stuff]
}
ListView.onAdd: {
console.log("This prints …
Run Code Online (Sandbox Code Playgroud) 编辑:我已经大量编辑了这篇文章,将项目剥离到其基本要素.我还添加了一个Github存储库,包括本文中未引用的文件.
我有一个使用subdirs
模板的Qt Creator项目(qmake,Qt 5.2.0,Creator 3.0.0).有三个子项目:
TEMPLATE = lib
和的图书馆CONFIG += staticlib
.TEMPLATE = lib
和CONFIG += staticlib
并使用Field
图书馆.我正在Windows 8.1(MSVC2012)和Linux(gcc 4.8.1)上构建此应用程序.它在Windows上没有问题,但Linux构建表现奇怪.
我得到的错误看起来像这样:
undefined reference to 'vtable for Stadium::Engine'
Run Code Online (Sandbox Code Playgroud)
我已经将这个项目重写为一组显示错误的裸文件.你可以在Github上找到它:足球.随意克隆它,并为自己看到所有的错误.该661441c
承诺解决问题,并09836f9
提交包含错误.
Stadium Engine.h文件是一个抽象类.它看起来像这样:
#ifndef STADIUM_ENGINE_H
#define STADIUM_ENGINE_H
#include <QObject>
namespace Stadium {
class Engine : public QObject
{
Q_OBJECT
public slots:
virtual void executeCommand() = 0;
};
} …
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一些代码.这是我得到的错误:
main.o: In function `__static_initialization_and_destruction_0':
/home/jmbeck/Downloads/boost_1_48_0/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
Run Code Online (Sandbox Code Playgroud)
还有更多,但我不认为这是相关的.
这是构建命令:
g++ -I/home/jmbeck/Downloads/boost_1_48_0
-L/home/jmbeck/Downloads/boost_1_48_0/stage/lib
-lm
-lboost_system
-lboost_thread
-lboost_regex
main.cpp
Run Code Online (Sandbox Code Playgroud)
/ home/jmbeck/Downloads/boost_1_48_0/stage/lib目录包含预期的文件:
libboost_system.a
libboost_system.so@
libboost_system.so.1.48.0*
libboost_thread.a
libboost_thread.so@
libboost_thread.so.1.48.0*
libboost_regex.a
libboost_regex.so@
libboost_regex.so.1.48.0*
... etc...
Run Code Online (Sandbox Code Playgroud)
我已经尝试构建一个没有使用预编译库的快速程序,它编译得很好.它找到了合适的标题,但不是库.
我究竟做错了什么?
当我压缩分支中的提交(使用 git rebase -i)时,我总是很恼火,因为压缩的提交与旧的提交而不是新的提交结合在一起。
我不明白为什么要这样设计。当我提交正在进行的工作 (WIP) 时,它表示未编译或未完成的代码。当我最终承诺“它终于起作用了!” 在合并之前进行提交和压缩,将这些 WIP 提交合并到“它终于可以工作了!”中更有意义。提交,而不是与之前的提交合并。压缩 WIP 本质上是用我知道无法编译的代码“破坏”了之前的提交。
为了解决这个问题,我的工作流程是压缩来自“它有效!”的提交。一直回到第一次 WIP 提交之前的状态。但这不是很愚蠢吗?其他人在做什么,这使得将 WIP 压缩到之前的提交有意义?
我正在开发一个用Java编写的项目,旨在通过一个严格定义消息字段位位置的消息系统来传输数据.这意味着我们有一个完整的字典类库,旨在将对象输入数据移位到消息二进制表示或从消息二进制表示移位.这个库相当大,并且因为协议还很年轻,所以每年都有调整和改变的倾向.
此库的JavaDoc提供了ASCII艺术表和图表,用于解释特定方法期望作为输入(或输出)的内容.这些表格非常重要,因为查找文档并验证该方法实际上是否符合文档所说的内容可能非常耗时,容易出错.使用单个简单的ASCII位表示位移使得这更容易.
我有一个同事坚持认为ASCII艺术不属于JavaDoc(即使是标签),而且我们配置Eclipse以自动格式化保存代码.他提供了两种重新格式化文档的选项:
除了Eclipse不渲染SVG图像外,图像没问题.我完全不能接受的是,我们维护一个SVG图像,然后将图像作为PNG导出到我们的文档仓库,然后将PNG与HTML链接起来.这种情况下涉及的维护量似乎完全疯了.谁负责确保所有PNG,SVG和代码同步?此外,显然,没有图像,数据将无法读取.
HTML表选项很糟糕,原因有两个.首先,Eclipse格式化程序将每个标记和值放在它自己的行上,这意味着每个值都占用三行.它在源代码中留下了巨大的空白,并且在不呈现HTML的情况下完全不可读.更糟糕的是,我们的一些表格很复杂,并且对HTML表格进行故障诊断并不是我对负责任的事情的想法,而是要求已经拒绝创建文档的开发人员.
因此,如果我的同事关于"java人"不使用ASCII图表进行文档化,那么什么是标准的行业实践,为我们提供了保存这些图表的方法?与使用ASCII图标签相比,这种方法有何益处?如果你能回答为什么JavaDoc没有发展为提供可读标记而不依赖于HTML,那么奖励点.
编辑:我刚发现markdown-doclet.我不知道这是否是一个可以接受的妥协.也许还有其他类似的工具?
我一直在松散地关注Christophe Dumez博客上的文章,以获得一个自定义的QAbstractListModel类来将数据暴露给QML(QtQuick2)接口(QtQuick2ApplicationViewer).但是,由于我使用的是Qt 5.0.0(和MSVC2012),他的文章的某些部分并不适用.例如,ListModel构造函数不再需要调用setRoleNames()
,因为setRoleNames()
已在Qt 5中折旧.
ListModel::ListModel(ListItem* prototype, QObject *parent) :
QAbstractListModel(parent), m_prototype(prototype)
{
setRoleNames(m_prototype->roleNames());
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,从QAbstractListModel继承的类必须只定义roleNames()
,因为它在Qt 5中被改为纯粹的虚函数.所以在他的例子中,我只是setRoleNames(m_prototype->roleNames());
在构造函数中注释掉,一切都应该有效.对?
但是,当通过QML访问时,所有定义的角色都是未定义的.我可以用这个来检查C++中的名字:
QHash<int, QByteArray> mynames = model->find("Elephant")->roleNames();
qDebug() << "Model: " << mynames;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Elephant对象的角色名称按预期打印.
我的假设是否正确,或者我是否需要做其他事情才能使QAbstractListModel对象与QML2共享列表元素属性?这似乎是一个愚蠢的问题,但Qt5文档现在已经破了,我无法弄明白.
谢谢!