删除最后一行时,QTableWidget的单元格小部件无法正确显示

时间:2015-11-13 13:40:02

标签: c++ qt qtablewidget

我有一个QTableWidget,它将QPushButtons作为单元格小部件。我使用这些按钮作为从表中删除行的方法。我有一个问题,QPushButtons可能会被意外地从他们的单元格中心转移。下图显示了正在发生的事情。

enter image description here

这发生在用户具有1)在表的最后一行中选择了一个单元格,2)该单元格包含删除按钮,以及3)移动垂直滚动条使得最后一行的特定情况下部分可见。

以下是一个非常小的示例,可以解决此问题。用户需要使用滚动条并向上滚动一个刻度,然后按最后一个删除按钮。

mainwindow.h:

#pragma once

#include <QMainWindow>

class QSignalMapper;
class QTableWidget;
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void DeletePressed(int row);

private:
    QSignalMapper* signalMapper_;
    QTableWidget* table_;
};

mainwindow.cpp:

#include "mainwindow.h"

#include <QGridLayout>
#include <QSignalMapper>
#include <QTableWidget>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    signalMapper_(new QSignalMapper(this)),
    table_(new QTableWidget())
{
    setCentralWidget( new QWidget );
    this->setFixedSize(200,300);

    QGridLayout *layout = new QGridLayout(centralWidget());
    layout->addWidget(table_);

    table_->setRowCount(0);
    table_->setColumnCount(1);

    // if you comment out the following line then the problem is not present
    table_->setSelectionMode(QAbstractItemView::SingleSelection);

    for (int i = 0; i < 20; i++) {
        table_->insertRow(i);
        QPushButton *button = new QPushButton("Delete");
        connect(button, SIGNAL(clicked(bool)), signalMapper_, SLOT(map()));
        signalMapper_->setMapping(button, i);
        table_->setCellWidget(i, 0, button);
    }
    connect(signalMapper_, SIGNAL(mapped(int)), this, SLOT(DeletePressed(int)));

    table_->setCurrentCell(19,0);
}

MainWindow::~MainWindow()
{
}

void MainWindow::DeletePressed(int row)
{
    table_->clearSelection(); // <- added clear selection before remove row
    table_->removeRow(row);
}

的main.cpp

#include <QApplication>
#include "mainwindow.h"

int main( int argc, char* argv[] )
{
    QApplication app(argc, argv);
    MainWindow wnd;
    wnd.show();
    return app.exec();
}

我认为问题源于QTableWidget尝试在进行新选择时保持所选单元格可见。我已经尝试了here发布的两个答案,但都没有解决我的问题。

如果有人能告诉我如何解决这个问题,我将不胜感激。

3 个答案:

答案 0 :(得分:1)

很久以前我遇到类似的问题QtreeWidget我通过callig protected method updateGeometries()解决了这个问题。

如果你没有专门化QTableView,你不能简单地调用这个函数(因为它受到保护),所以这是一个简单的做法:

class MyQTableView : public QTableView
{
public:
    inline void publicUpdateGeometries() { updateGeometries(); }
};

void MainWindow::DeletePressed(int row)
{
    table_->clearSelection(); // <- added clear selection before remove row
    table_->removeRow(row);

    // call the protected method QTableView::updateGeometries()
    ((MyQTableView*) table_)->publicUpdateGeometries();
}

希望这能解决您的问题。

答案 1 :(得分:0)

尝试ui->tableWidget->clearSelection();

答案 2 :(得分:0)

只有在添加滚动条时才会发生这种情况。要解决此问题,您需要设置setvrticalscrollbarpolicy以关闭滚动条,然后删除行并根据需要添加setverticalbarpolicy滚动。 它会解决你的问题。 我做了同样的事。