标签: model-view

Qt:点击一下即开始编辑单元格

默认情况下,QTableView双击后开始编辑单元格.如何改变这种行为.我需要它在一次点击后开始编辑.

我已将组合框委托设置为单元格.单击单元格时,它只选择它.双击单元格时,QComboBox编辑器已激活但未展开.我希望它只需点击一下就可以扩展,就像我添加QComboBoxsetCellWidget功能一样QTableWidget.我使用model-view-delegate需要相同的效果.

c++ qt delegates qtableview model-view

17
推荐指数
2
解决办法
1万
查看次数

如何在保留选择的同时刷新QSqlTableModel?

我使用的是QSqlTableModelQTableView查看SQLite数据库表.

我想让表每隔一秒自动刷新一次(它不会是一个非常大的表 - 几百行).我可以这样做 - 就像这样:

QTimer *updateInterval = new QTimer(this);
updateInterval->setInterval(1000);
updateInterval->start();
connect(updateInterval, SIGNAL(timeout()),this, SLOT(update_table()));

...

void MainWindow::update_table()
{
    model->select(); //QSqlTableModel*
    sqlTable->reset(); //QTableView*
}
Run Code Online (Sandbox Code Playgroud)

但是这会删除我的任何选择,因此选择只持续一秒钟.这很烦人,因为GUI中的另一个窗格取决于所选择的内容.如果未选择任何内容,则会重置为解释启动页面.

然后我尝试了一种有点hacky的方法,它获取所选的行号,重置表,然后选择该行.但这也不起作用,因为所选行可以根据对表的添加来上移或下移.

我知道其他班级都有dataChanged()信号,这是理想的.

你们中的任何人都知道如何刷新表以反映数据库的更改(从命令行使用或程序的其他实例)并保持当前选择?

我知道我可以从当前选择中获取数据,然后在重置后搜索同一行然后重新选择它,但这似乎是一个适得其反的问题.

编辑:当前尝试解决方案:

void MainWindow::update_table()
{    

    QList<QModelIndex> selection = sqlTable->selectionModel()->selection().indexes();
    QList<int> selectedIDs;
    bool somethingSelected = true;

    for(QList<QModelIndex>::iterator i = selection.begin(); i != selection.end(); ++i){
        int col = i->column();
        QVariant data = i->data(Qt::DisplayRole);

    if(col == 0) {
            selectedIDs.append(data.toInt());
        }
    }

    if(selectedIDs.empty()) somethingSelected = false; …
Run Code Online (Sandbox Code Playgroud)

c++ qt model-view qsqltablemodel

12
推荐指数
1
解决办法
5460
查看次数

如何在Qt中重置模型?

我正在使用Qt模型/视图框架.当我重置模型中的数据时,我必须重置模型以使视图也更新.怎么做?我modelReset(QPrivateSignal);在QAbstractItemModel中找到了一个信号,这是解决它的方法吗?如何发出信号?谢谢.

qt model-view

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

如何在新的Android架构组件中正确使用Dagger2

我正在尝试使用新的架构组件,但我还是匕首的新手,而且我缺少了东西.

使用下面的代码,我得到一个NullPointerException,找不到位置.如果还有其他我需要修复或改进的地方,请建议.

代码: ViewModel

public class PostsVM extends ViewModel {
    private LiveData<StoryPost> post;
    private Repository          repository;

    @Inject
    public PostsVM(Repository repository) {
        this.repository = repository;
    }

    public void init() {
        if (this.post != null) {
            return;
        }
        post = repository.getPosts();
    }

    public LiveData<StoryPost> getPost() {
        return post;
    }
}
Run Code Online (Sandbox Code Playgroud)

知识库

@Singleton
public class Repository {
    private final MutableLiveData<StoryPost> data = new MutableLiveData<>();

    public LiveData<StoryPost> getPosts() {
        //
        new GetUser(post.getUid()) {
            @Override
            public void onSuccess(@NonNull User user) {
                // this is where …
Run Code Online (Sandbox Code Playgroud)

java android model-view dagger-2 android-architecture-components

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

Android JetPack的共享ViewModel生命周期

该文件 https://developer.android.com/topic/libraries/architecture/viewmodel#sharing描述了如何在不同的片段之间共享相同的ViewModel。

我的页面有些复杂 单个“活动”应用程序中其中包含容器和选项卡片段。每个此类页面都有自己的ViewModel,应与所有包含的片段共享。

这里的关键技巧是使用Activity而不是Fragment来保存我的ViewModel。

问题是我的活动可以有多个具有自己的模型的页面,并且始终保持特定页面的视图模型是浪费设备资源。

当用户离开页面时,是否有任何方法可以控制ViewModel的生命周期以销毁它?

我想使用容器片段而不是活动:

model = ViewModelProviders.of(getPageContainerFragment()).get(SharedViewModel.class);
Run Code Online (Sandbox Code Playgroud)

但是发现这个想法不是很好,因为所有子片段都应该了解父元素,而这可能不是很好。

是否有其他方法可以正确处理这种情况?

android model-view android-fragments android-architecture-components android-jetpack

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

QTreeView或QTreeWidget

我想在我的程序中实现一个嵌套子级别的树,我正在寻找这两种类型中的哪一种(View/Widget)最适合我的目标.

我有一个任务日期列表,其中包括已完成/错过/失败,每个任务都计算完成/错过/失败的次数,最后是当天的分数.

我想像这样显示它们:

树显示

我在QtCreator中使用QTreeWidget做了这个例子,但是我担心修改元素很难,因为它们存储在其他地方.

我的担忧是否合理,我应该转到模型/视图结构,还是可以轻松使用QTreeWidget?树将记录任务,因此将不断变化.元素只会添加到它,而不是删除.日期将从最高 - 最低(第2天,第1天,第1天)排序

treeview qt design-patterns qtreewidget model-view

8
推荐指数
1
解决办法
7954
查看次数

将QTableView与模型一起使用

我有QVector cars,我想根据汽车的注册号进行过滤.我想创建一个新的过滤矢量.我认为这没关系,因为我正在迭代2个向量,从第一个向量复制到第二个向量.我这样做了吗?

void MainWindow::on_actionBy_registration_number_triggered()
{
    myDialog = new MyDialog(this);
    myDialog->exec();

    QString toSearchString = myDialog->getRegistrationNumber();
    QVector<Vehicle> founded;
    QVectorIterator<Vehicle> iterator(cars);
    while(iterator.hasNext()){
        Vehicle car = iterator.next();
        QString num = car.getRegistration().getRegistrationNumber();
        if(num.contains(toSearchString,Qt::CaseInsensitive)){
            founded.append(car);
        }
    }
    model = new QStandardItemModel(founded.size(),5,this);

    //create header
    createHeader(model);

    int j = 0; //row
    QVectorIterator<Vehicle> iter(founded);
    while(iter.hasNext()){
        Vehicle output = iter.next();
        //set car
        QString makeAndModel = output.getGeneralData().getMake() + output.getGeneralData().getModel();
        QStandardItem *mAndM = new QStandardItem(QString(makeAndModel));
        model->setItem(j,0,mAndM);

        //set type
        QStandardItem *type = new QStandardItem(QString(output.getGeneralData().getType()));
        model->setItem(j,1,type);

        //set mileage
        QString mileageString = QString::number(output.getGeneralData().getMileage());
        QStandardItem …
Run Code Online (Sandbox Code Playgroud)

c++ qt model-view

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

QTableView滚动到新添加的行

要向模型添加新行,我正在调用beginInsertRowsendInsertRows().如何配置视图以滚动到新添加的行并选择它.我可以通过发送一些信号来做到这一点,但也许Qt有标准的方式.

c++ qt row qtableview model-view

7
推荐指数
2
解决办法
9626
查看次数

带有键盘数百万项的QListView

我正在使用一个QListView源自的自定义模型QAbstractItemModel.我有数百万件物品.我打电话listView->setUniformItemSizes(true)来阻止在向模型添加项目时调用一堆布局逻辑.到目前为止,一切都按预期工作.

问题是使用键盘导航列表很慢.如果我在列表中选择一个项目,然后按向上/向下,选择将快速移动,直到选择需要滚动列表.然后变得非常迟钝.按向上翻页或向下翻页也非常滞后.问题似乎是当使用键盘选择项目(也就是"当前项目")时,列表也会向上/向下滚动.

如果我使用鼠标,导航列表很快.我可以使用快速的鼠标滚轮.我可以按照我想要的速度向上/向下拖动滚动条 - 从列表顶部到底部 - 列表视图快速更新.

关于为什么改变选择和滚动列表的组合如此缓慢的任何想法?有可行的解决方案吗?

2015年9月9日更新

为了更好地说明问题,我在此更新中提供了放大信息.

KEYBOARD + SCROLLING的性能问题

这主要是性能问题,尽管它确实与用户体验(UX)有关.看看当我使用键盘滚动浏览时会发生什么QListView:

慢滚动问题

注意底部附近的减速?这是我的问题的焦点.让我解释一下我如何浏览列表.

说明:

  1. 从顶部开始,选择列表中的第一个项目.
  2. 按下并保持向下箭头键,当前项(选择)更改到下一个项目.
  3. 对于当前查看的所有项目,快速更改选择.
  4. 一旦列表需要将下一个项目放入视图中,选择速率就会显着降低.

我希望列表能够像键盘的打字速度一样快地滚动 - 换句话说,选择下一个项目所花费的时间不应该在滚动列表时减慢.

使用MOUSE快速滚动

这是我使用鼠标时的样子:

快速鼠标导航

说明:

  1. 使用鼠标,我选择滚动条手柄.
  2. 快速向上和向下拖动滚动条手柄,相应地滚动列表.
  3. 所有动作都非常快.
  4. 请注意,没有选择.

这证明了两个要点:

  1. 模型不是问题.如您所见,该模型在性能方面没有任何问题.它可以比显示元素更快地传递元素.

  2. 选择和滚动时性能会降低.选择和滚动的"完美风暴"(如使用键盘在列表中导航所示)导致减速.因此,我推测,在滚动期间正常执行的选择时,Qt以某种方式进行了大量处理.

非Qt实施是快速的

我想指出,我的问题似乎与Qt有关.

在使用不同的框架之前,我已经实现了这种类型的东西.我想做的是在模型 - 视图理论的范围内.我可以使用带有juce :: ListBox的juce :: ListBoxModel以极快的速度完成我所描述的内容.这是愚蠢的快速(此外,当每个项目已经具有唯一索引时,不需要为每个项目创建重复索引,例如a ).我认为Qt需要针对其模型 - 视图架构的每个项目,虽然我不喜欢开销成本,但我认为我理性,我可以忍受它.无论哪种方式,我都不怀疑这些因素导致我的表现减慢.QModelIndexQModelIndexQModelIndex

通过JUCE实现,我甚至可以使用向上翻页和向下翻页键来导航列表,它只是在列表中闪现.使用Qt QListView实现,即使使用发布版本,它也会突然出现并且很迟钝.

使用JUCE框架的 …

c++ qt qlistview qabstractitemmodel model-view

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

RxCpp RAII 可观察订阅

我在模型视图设置中使用 RxCpp。视图更新方法订阅可观察对象(通过 lambda 捕获this)。如果订阅的寿命比视图实例的寿命长,就会发生未定义的内存访问。我不希望订阅使视图保持活动状态。因此,我需要订阅在视图的析构函数上确定地结束。这听起来像是 RAII 的一个例子。

这有危险吗?这是否是对 rx 的滥用?我读过的书更喜欢take_until类似的环境。为什么这样会更好,以及如何在这里使用它?

谢谢你!

#include "rxcpp/rx.hpp"

class MyView : public View
{
public:
    MyView(rxcpp::observable<int> obs) : obs (obs)
    {
        sub = obs.subscribe ([this] (int i) { update(i); });
    }
    ~MyView()
    {
        sub.unsubscribe();
    }
    void update(int i)
    {
        number = i;
        repaint();
    }
private:
    rxcpp::observable<int> obs;
    rxcpp::subscription sub;
    int number;
};
Run Code Online (Sandbox Code Playgroud)

c++ raii model-view rxcpp

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