在我的 qt 应用程序中,我有一个类(worker),它是从在线程中运行的对象调用的。在我的工人阶级中,我创建了 QList,如下所示
QList <QString> albums;
while (i.hasNext())
{
QRegularExpressionMatch album = i.next();
albums.append(album.captured("album"));
}
emit SignalGotAlbums(albums);
Run Code Online (Sandbox Code Playgroud)
我在另一个包装我的工作线程的类中收到这个信号,以供线程使用。我们将此类命名为 GetAlbumsThread。在那里我成功地在插槽中接收到 SignalGotAlbums
void GetAlbumsThread::Reply(QList <QString> &list)
{
emit gotAlbums(list);
emit finished();
}
Run Code Online (Sandbox Code Playgroud)
在这个插槽中,我正在触发另一个信号gotAlbums,该信号应该与我的gui线程中的插槽连接,并将我的QList传递到那里。我的问题是,当我尝试将 QList 从线程传递到 gui 时,它不起作用!插槽未收到 gotAlbums 信号;
信号声明如下:
void gotAlbums(QList<QString> &);
Run Code Online (Sandbox Code Playgroud)
并连接到我的 gui 插槽(当然在我的 gui 线程中),如下所示:
private slots:
void AlbumsReceived(QList<QString> &list)
...
QThread* albumsThread = new QThread();
GetAlbumsThread *albumsObject = new GetAlbumsThread();
albumsObject->moveToThread(albumsThread);
connect(albumsThread, SIGNAL(started()), albumsObject, SLOT(process()));
connect(albumsObject, SIGNAL(gotAlbums(QList<QString> &)), this, SLOT(AlbumsReceived(QList<QString> &));
albumsThread->start();
Run Code Online (Sandbox Code Playgroud)
由于某种原因,AlbumsReceived 从未被调用。连接返回真。有人可以帮我弄这个吗。我认为问题在于线程之间传递 QList。
我正在做一些关于在基于 Qt 的应用程序中处理错误的研究,在阅读了一些关于 Qt 使用断言而不是异常抛出的文章后,我想到了以下问题:
Qt 类的某些方法会在其中发生错误时使应用程序立即崩溃。例如,如果我使用 Qt 容器(例如 QList)并调用大于容器大小的成员,则软件会立即关闭:
QList<int> myList;
int itemp = myList.at(1);
//Crash!
Run Code Online (Sandbox Code Playgroud)
现在我不希望在我的应用程序中发生这种情况:如果发生这样的事件,我想处理该事件(即使只是在错误日志中记录某些内容并稍后关闭应用程序)。但是,如果 Qt 在我进行任何错误检查之前使软件崩溃,我该怎么做?并且将代码放在 try-catch 中是行不通的,因为 Qt 在发生这种情况时不会抛出任何内容(至少在未启用异常时不会抛出,这是我假装使用的)。有没有办法解决这个问题?
QList::fromStdList允许您创建QList的std::list.但如何建立QList从std::vector?
当然,除了手动循环:
QList<T> myList;
myList.reserve(vector.size());
for(size_t i = 0, l = vector.size(); i < l; ++i)
myList << vector[i];
Run Code Online (Sandbox Code Playgroud) 我是C++的新手,我正在试图弄清楚如何执行以下操作:
我有一个包含QList的类.我正在尝试填充QList,如下所示.我想知道如何实现这一目标?这是在NumberList构造函数中完成的吗?我通常会使用一个获取对象列表的方法来填充myList,并提取它们以填充QList,但这对我下面的示例不起作用.
NumberList myList;
myList << 1 << 2 << 3;
Run Code Online (Sandbox Code Playgroud) 我想创建一个QObservableCollection包装器QList(使用内部QList实现和转发所有调用,同时为更改集合的函数发出某种CollectionsChanged信号),但我看到它QList不继承QObject.
我相信你需要继承QObject以发出Qt信号.所以我需要继承QObject我的QObeservableCollection.
但是QList和QVector其他Qt系列并没有继承QObject,所以我想他们必须是某种下行或问题来制作一个集合.
我看到QSignalSpy继承自两者 QObject,QList<QList<QVariant>>所以也许他们只是没有看到继承QObject的理由?
假设我有以下列表:
QList<Type*> list;
list.add(new Type());
list.add(new Type());
list.add(new Type());
list.add(new Type());
list.add(new Type());
list.add(new Type());
Run Code Online (Sandbox Code Playgroud)
如果我想清空列表,我可以打电话 list.clear()
它会自动删除每个指针,还是必须执行以下操作以防止内存泄漏:
foreach (Type* t, list) delete t;
list.clear();
Run Code Online (Sandbox Code Playgroud) 我在排序QList包含以下内容的实例时遇到问题struct:
class modelHeuristic
{
typedef struct {
QString c;
QString t;
double value;
}Saving;
public:
QList<Saving> list_saving;
#include "klarkeright.h"
klarkeRight::klarkeRight()
{
}
void klarkeRight::Algoritmo_Asimetrico(modelHeuristic *model)
{
qSort(model->list_saving.begin(), model->list_saving.end());
}
Run Code Online (Sandbox Code Playgroud)
错误:二进制表达式的无效操作数('const modelHeuristic :: Saving'和'const modelHeuristic :: Saving')return(t1 <t2);
我目前的情况是,我有一个 QList,其中 MyClass 还包括一个列表 QList。
为了显示这个列表层次结构,我想在 ListView 中提供一个 Repeater。
我用 QStringList 尝试过,它工作正常(请参阅下面未注释的行)。当我尝试使用 QList 执行此操作时,我无法访问 MySubClass 的名称属性。相反,显示 MyClass 的名称属性。
错误的输出:
Object 1
Object 1
Object 1
Object 2
Run Code Online (Sandbox Code Playgroud)
正确的输出应该是:
Object 1
SubObject 1
SubObject 2
Object 2
Run Code Online (Sandbox Code Playgroud)
编辑:2014 年 12 月 8 日 我发现,为什么子列表不起作用。我只需替换子 ListView 的委托中的一行(名称 -> modelData.name)。
这是我的代码:
主程序
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QList>
#include <QDebug>
#include "myclass.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
/* create simple stringlist */
QStringList dataList;
dataList << "Data …Run Code Online (Sandbox Code Playgroud) 我有这个简单的类:
class SomeClass
{
QString key;
QString someData;
int otherField;
public:
QString getKey() { return key };
};
Run Code Online (Sandbox Code Playgroud)
我有这个清单:
QList<SomeClass*> myList;
Run Code Online (Sandbox Code Playgroud)
我想检查 myList 是否包含 key = "mykey1" 的对象;
for(int i = 0; i < myList.size(); i++)
{
if(myList.at(i)->getKey() == "mykey1")
{
//do something with object, that has index = i
}
}
Run Code Online (Sandbox Code Playgroud)
是否有任何标准函数可以循环并返回此对象或索引或指针?,所以我不需要使用循环
我有一个QStringList,我需要清理一些无意义的元素:空字符串和空字符串.
我找不到QStringList快捷功能.
清除空/空字符串的最简单方法是什么?