我有一个QTableWidget,它将QPushButtons作为单元格小部件。我使用这些按钮作为从表中删除行的方法。我有一个问题,QPushButtons可能会被意外地从他们的单元格中心转移。下图显示了正在发生的事情。
这发生在用户具有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发布的两个答案,但都没有解决我的问题。
如果有人能告诉我如何解决这个问题,我将不胜感激。
答案 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滚动。 它会解决你的问题。 我做了同样的事。