diff --git a/modules/gui/qt/medialibrary/mlbasemodel.cpp b/modules/gui/qt/medialibrary/mlbasemodel.cpp
index af30a63cff275b7e715756083734ba5f45d6711b..d3f4a680f93c2ad64859b1c7e4eb988897e35c64 100644
--- a/modules/gui/qt/medialibrary/mlbasemodel.cpp
+++ b/modules/gui/qt/medialibrary/mlbasemodel.cpp
@@ -114,7 +114,7 @@ public:
             int count = q->getCount();
             int limit = q->getLimit();
             //item doesn't exists
-            if ((limit != 0 && count >= limit) || loaded == getMaximumCount()) {
+            if ((limit >= 0 && count >= limit) || loaded == getMaximumCount()) {
                 cb(std::nullopt);
             }
             else
diff --git a/modules/gui/qt/util/base_model.cpp b/modules/gui/qt/util/base_model.cpp
index dc3e9a60a1a1be7352aed90ce7b14150dc5901e2..5c7b88b0e18a26f30db3ca6e451e306abbbae9c2 100644
--- a/modules/gui/qt/util/base_model.cpp
+++ b/modules/gui/qt/util/base_model.cpp
@@ -76,13 +76,13 @@ void BaseModel::onCacheBeginMoveRows(int first, int last, int destination)
     emit beginMoveRows({}, first, last, {}, destination);
 }
 
-unsigned int BaseModel::getLimit() const
+int BaseModel::getLimit() const
 {
     Q_D(const BaseModel);
     return d->m_limit;
 }
 
-void BaseModel::setLimit(unsigned int limit)
+void BaseModel::setLimit(int limit)
 {
     Q_D(BaseModel);
     if (d->m_limit == limit)
diff --git a/modules/gui/qt/util/base_model.hpp b/modules/gui/qt/util/base_model.hpp
index 19299a2a878631284b77b848e519c48db59cf682..f671fe36df7d2ea834b36232e8cdbfd7167c845b 100644
--- a/modules/gui/qt/util/base_model.hpp
+++ b/modules/gui/qt/util/base_model.hpp
@@ -39,8 +39,9 @@ class BaseModel : public QAbstractListModel, public QQmlParserStatus
                    NOTIFY sortCriteriaChanged RESET unsetSortCriteria FINAL)
 
     //maximum number of element to load
-    //limit = 0 means all elements are loaded
-    Q_PROPERTY(unsigned int limit READ getLimit WRITE setLimit NOTIFY limitChanged FINAL)
+    //limit < 0 means all elements are loaded
+	// QML does not have type ssize_t
+    Q_PROPERTY(int limit READ getLimit WRITE setLimit NOTIFY limitChanged FINAL)
 
     //skip in N first elements
     Q_PROPERTY(unsigned int offset READ getOffset WRITE setOffset NOTIFY offsetChanged FINAL)
@@ -70,8 +71,8 @@ public:
     virtual void setSortCriteria(const QString& criteria);
     virtual void unsetSortCriteria();
 
-    unsigned int getLimit() const;
-    void setLimit(unsigned int limit);
+    int getLimit() const;
+    void setLimit(int limit);
     unsigned int getOffset() const;
     void setOffset(unsigned int offset);
 
diff --git a/modules/gui/qt/util/base_model_p.hpp b/modules/gui/qt/util/base_model_p.hpp
index ebe8e38a5a1a156aad13933b364aa343939b3d84..7a6a6aac1b6e7a60064ca633688e5a3ee3c78852 100644
--- a/modules/gui/qt/util/base_model_p.hpp
+++ b/modules/gui/qt/util/base_model_p.hpp
@@ -114,7 +114,7 @@ protected:
     QString m_searchPattern = {};
     Qt::SortOrder m_sortOrder = Qt::SortOrder::AscendingOrder;
     QString m_sortCriteria = {};
-    unsigned int m_limit = 0;
+    ssize_t m_limit = -1;
     unsigned int m_offset = 0;
     bool m_qmlInitializing = false;
 };
diff --git a/modules/gui/qt/util/listcache.hpp b/modules/gui/qt/util/listcache.hpp
index 3dd1f41bc7730f493bb8ab90b7f1551f63a97316..58ccaf2e7c54155c82272040e71d3b457105af9f 100644
--- a/modules/gui/qt/util/listcache.hpp
+++ b/modules/gui/qt/util/listcache.hpp
@@ -145,7 +145,7 @@ public:
     static constexpr ssize_t COUNT_UNINITIALIZED = -1;
 
     ListCache(std::unique_ptr<ListCacheLoader<ItemType>>&& loader,
-        bool useMove, size_t limit, size_t offset, size_t chunkSize = 100);
+        bool useMove, ssize_t limit, size_t offset, size_t chunkSize = 100);
 
     /**
      * Return the item at specified index
@@ -273,8 +273,8 @@ private:
     QSharedPointer<ListCacheLoader<ItemType>> m_loader;
     size_t m_chunkSize;
 
-    //0 limit means no limit
-    size_t m_limit = 0;
+    //negative limit means no limit
+    ssize_t m_limit = -1;
     size_t m_offset = 0;
 
     //highest index requested by the view (1 based, 0 is nothing referenced)
diff --git a/modules/gui/qt/util/listcache.hxx b/modules/gui/qt/util/listcache.hxx
index 68c069591b81ee10a3b4b606076bf71cd617f536..70ecaf8a981ea318910cf13a89614acc9369c463 100644
--- a/modules/gui/qt/util/listcache.hxx
+++ b/modules/gui/qt/util/listcache.hxx
@@ -45,7 +45,7 @@ bool ListCache<T>::cacheDataCompare(const void* dataOld, uint32_t oldIndex, cons
 }
 
 template<typename T>
-ListCache<T>::ListCache(std::unique_ptr<ListCacheLoader<ListCache<T>::ItemType>>&& loader, bool useMove, size_t limit, size_t offset, size_t chunkSize)
+ListCache<T>::ListCache(std::unique_ptr<ListCacheLoader<ListCache<T>::ItemType>>&& loader, bool useMove, ssize_t limit, size_t offset, size_t chunkSize)
     : m_useMove(useMove)
     , m_loader(loader.release())
     , m_chunkSize(chunkSize)
@@ -549,8 +549,8 @@ void ListCache<T>::asyncCountAndLoad()
                 m_needReload = true;
             }
 
-            size_t queryCount = (m_limit > 0)
-                ? std::min(m_limit, maximumCount)
+            size_t queryCount = (m_limit >= 0)
+                ? std::min(static_cast<size_t>(m_limit), maximumCount)
                 : maximumCount;
 
             //note: should we drop items past queryCount?