QTableView在按钮点击后不更新编辑的单元格

3
我将使用QTableView作为行输入方法: 用户填写字段,然后单击“Carica”按钮执行插入(不需要填写整个行)。
假设用户像图中一样插入第一个字段,然后单击“carica”。按钮代码会被触发:
    QModelIndex index = modelprod->index(0, 0); //modelprod is model for the QTable
    qInfo() << index.data().toString();

程序没有输出任何内容!这是因为tableview没有存储该值(请注意,单元格周围是蓝色的)。如果用户在点击按钮之前点击其他东西,则程序按预期工作。 enter image description here 我需要一种方法,在用户点击按钮后立即更新模型。 代码示例请求:

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),ui(new Ui::MainWindow){
    ui->setupUi(this);
    modelp = new QStandardItemModel(1,1,this);
    modelp->setHorizontalHeaderItem(0, new QStandardItem(QString("ID")));
    ui->tableView->setModel(modelp);
}
MainWindow::~MainWindow(){delete ui;}

void MainWindow::on_pushButton_clicked(){
    int rowcount = modelp->rowCount(QModelIndex());
    QModelIndex index = modelp->index(0, 0);
    modelp->setItem(rowcount,0, new QStandardItem(QString(index.data().toString()))); 
    //add the element in row 0 into a new row in the same tableView
}

mainwindow.h

namespace Ui{class MainWindow;}
class MainWindow : public QMainWindow{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
    QStandardItemModel *modelp;
};

enter image description here

在图像中,我将其插入到单元格"test"中。 在不单击任何其他位置的情况下,我单击按钮。 当意图是将第一行内容复制到新行时,会创建一个新的空行。 现在,如果我单击空单元格,然后再单击按钮,它会正确地写入一个新单元格。

modelprod是自定义模型还是标准模型之一,如果是自定义模型,请向我们展示代码。 - eyllanesc
在按下按钮之前,您可以单击另一个单元格。 - eyllanesc
1
模型在编辑结束时更新,不会在编辑过程中更新以提高效率,因此我想用我之前评论中的方法来证实它。 - eyllanesc
抱歉,但这似乎不是正确的解决方案。虽然我知道,用户可能不知道。 - Francesco Pegoraro
没有人是用户!我是一名学生,想要学习Qt。这意味着我想要制作“可用”的应用程序。 - Francesco Pegoraro
显示剩余20条评论
2个回答

3

在Mac OSX上,QPushButton的默认焦点策略似乎是TabFocus。这意味着当单击按钮时,表格单元格的编辑器不会失去焦点。因此,请尝试将按钮的策略更改为ClickFocusStrongFocus

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    modelp = new QStandardItemModel(1,1,this);
    modelp->setHorizontalHeaderItem(0, new QStandardItem(QString("ID")));
    ui->tableView->setModel(modelp);
    ui->pushButton->setFocusPolicy(Qt::ClickFocus);
}

非常感谢!确切地说,在Mac OSX上,QPushButton的默认焦点策略是TabFocus。也许稍微更好的选择是ClickFocus? - Francesco Pegoraro
1
@FrancescoPegoraro。谢谢 - 我已经修改了我的答案。 - ekhumoro

1
如果您不想干扰按钮的焦点策略,您也可以在按下按钮的单击处理程序中强制表视图关闭其编辑器,然后访问数据,通过强制清除焦点来实现:
void MainWindow::on_pushButton_clicked()
{
    // finish any editing
    if (ui->tableView->focusWidget())
        ui->tableView->focusWidget()->clearFocus();
    // ... do something with the data in the table
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接