【问题标题】:QTableView doesn't update edited cell when button is clicked单击按钮时,QTableView 不会更新已编辑的单元格
【发布时间】:2017-11-11 13:55:56
【问题描述】:

我使用 QTableView 作为行输入法: 用户填写字段,然后单击“Carica”按钮执行插入(他不应该填满整行)。

假设用户插入(如图所示)第一个字段,然后单击“carica”。按钮代码被触发:

    QModelIndex index = modelprod->index(0, 0); //modelprod is model for the QTable
    qInfo() << index.data().toString();

程序什么也不打印!这是因为 tableview 没有存储值(注意单元格是如何被蓝色包围的)。实际上,如果用户在按钮之前单击其他内容,则程序会按预期工作。

我需要一种方法来在用户单击按钮后立即更新模型。

请求的代码示例

ma​​inwindow.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
}

ma​​inwindow.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;
};

在图像中,我在单元格“测试”中插入。没有单击其他任何地方,我单击按钮。当意图复制新行中的第一行内容时,会创建一个新的空行。现在,如果我单击空单元格,然后单击按钮,它会正确地将其写入新单元格。

【问题讨论】:

  • modelprod 是自定义模型或标准之一,如果是自定义模型之一,请向我们展示代码。
  • 刚刚添加了代码。
  • 您可以在按下按钮之前单击另一个单元格
  • 但我注意到即使是普通的 QTableWidget 也有同样的问题。
  • 模型在版末更新,在编辑过程中没有更新以提高效率,所以想用我之前评论的方法来佐证一下。

标签: qt qt5 qtableview qpushbutton


【解决方案1】:

Mac OSX 上QPushButton 的默认focus-policy 似乎是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 可能是一个更好的选择?
  • @FrancescoPegoraro。谢谢 - 我已经修改了我的答案。
【解决方案2】:

如果您不想弄乱按钮的焦点策略,您还可以强制表格视图在访问数据之前在按钮的单击处理程序中关闭其编辑器,方法是强制它清除焦点:

void MainWindow::on_pushButton_clicked()
{
    // finish any editing
    if (ui->tableView->focusWidget())
        ui->tableView->focusWidget()->clearFocus();
    // ... do something with the data in the table
}

【讨论】:

    猜你喜欢
    • 2012-01-18
    • 2021-01-03
    • 2020-11-06
    • 2016-04-21
    • 2015-05-05
    • 1970-01-01
    • 2010-11-22
    • 2011-09-15
    • 1970-01-01
    相关资源
    最近更新 更多