单击按钮时 QTableView 不会更新已编辑的单元格
QTableView doesn't update edited cell when button is clicked
我正在使用 QTableView 作为行输入法:
用户填写字段,然后单击 "Carica" 按钮执行插入(他不应该填满整行)。
假设用户插入(如图所示)第一个字段,然后单击 "carica"。触发按钮代码:
QModelIndex index = modelprod->index(0, 0); //modelprod is model for the QTable
qInfo() << index.data().toString();
程序不打印任何内容!这是因为 tableview 没有存储值(注意单元格是如何被蓝色包围的)。实际上,如果用户在按钮之前单击其他内容,程序将按预期工作。
我需要一种在用户单击按钮时立即更新模型的方法。
请求的代码示例
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;
};
在图像中,我在单元格 "test" 中插入。我没有点击其他任何地方,而是点击了按钮。当意图复制新行中的第一行内容时,将创建一个新的空行。现在,如果我单击空单元格,然后单击按钮,它会正确地将其写入新单元格。
Mac OSX 上的 QPushButton
的默认 focus-policy 似乎是 TabFocus
。这意味着 table-cell 的编辑器在单击按钮时不会失去焦点。所以尝试将按钮的策略更改为 ClickFocus
或 StrongFocus
:
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);
}
如果您不想弄乱按钮的焦点策略,您还可以强制 table 视图在访问数据之前在按钮的单击处理程序中关闭其编辑器,方法是强制清除焦点:
void MainWindow::on_pushButton_clicked()
{
// finish any editing
if (ui->tableView->focusWidget())
ui->tableView->focusWidget()->clearFocus();
// ... do something with the data in the table
}
我正在使用 QTableView 作为行输入法: 用户填写字段,然后单击 "Carica" 按钮执行插入(他不应该填满整行)。
假设用户插入(如图所示)第一个字段,然后单击 "carica"。触发按钮代码:
QModelIndex index = modelprod->index(0, 0); //modelprod is model for the QTable
qInfo() << index.data().toString();
程序不打印任何内容!这是因为 tableview 没有存储值(注意单元格是如何被蓝色包围的)。实际上,如果用户在按钮之前单击其他内容,程序将按预期工作。
我需要一种在用户单击按钮时立即更新模型的方法。
请求的代码示例
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;
};
在图像中,我在单元格 "test" 中插入。我没有点击其他任何地方,而是点击了按钮。当意图复制新行中的第一行内容时,将创建一个新的空行。现在,如果我单击空单元格,然后单击按钮,它会正确地将其写入新单元格。
Mac OSX 上的 QPushButton
的默认 focus-policy 似乎是 TabFocus
。这意味着 table-cell 的编辑器在单击按钮时不会失去焦点。所以尝试将按钮的策略更改为 ClickFocus
或 StrongFocus
:
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);
}
如果您不想弄乱按钮的焦点策略,您还可以强制 table 视图在访问数据之前在按钮的单击处理程序中关闭其编辑器,方法是强制清除焦点:
void MainWindow::on_pushButton_clicked()
{
// finish any editing
if (ui->tableView->focusWidget())
ui->tableView->focusWidget()->clearFocus();
// ... do something with the data in the table
}