我在QPushButton
的最后一列中插入了QTableview
。使用该按钮,我将使用按钮释放信号和插槽handlebutton(int)
删除该特定行。
cpp代码:
MainWindow::MainWindow(QWidget *parent) :
QDialog(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QSortFilterProxyModel *model = new QSortFilterProxyModel(this);
model = pCApp->guiClient()->getConnectionManagement()->getProxyModel();
ui->tableView->setModel(model);
connect(pCApp, SIGNAL(CloseOpenWindowsRequested()), SLOT(close()));
connect(ui->tableView->model(), SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(onRowsNumberChanged()));
connect(ui->tableView->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(onRowsNumberChanged()));
ui->tableView->setSortingEnabled(true);
QPushButton *button;
QSignalMapper *mapper = new QSignalMapper(this);
QObject::connect(mapper, SIGNAL (mapped(int)), this, SLOT (handleButton(int)));
for (int i = 0; i < model->rowCount(); i++)
{
button = new QPushButton;
button->setText("Disconnect " + QString::number(i));
button->setStyleSheet("QPushButton { color: #E5E5E5; }");
ui->tableView->setIndexWidget(model->index(i,2, QModelIndex()), button);
QObject::connect(button, SIGNAL(released()), mapper, SLOT(map()));
connect(ui->tableView->model(), SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(onRowsNumberChanged()));
connect(ui->tableView->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(onRowsNumberChanged()));
mapper->setMapping(button, i);
}
setAttribute(Qt::WA_DeleteOnClose);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::handleButton(int row)
{
this->ui->tableView->model()->removeRow(row);
}
void MainWindow::onRowsNumberChanged()
{
QSortFilterProxyModel *model = new QSortFilterProxyModel(this);
model = pCApp->guiClient()->getConnectionManagement()->getProxyModel();
ui->tableView->setModel(model);
ui->tableView->setSortingEnabled(true);
QPushButton *button;
QSignalMapper *mapper = new QSignalMapper(this);
QObject::connect(mapper, SIGNAL (mapped(int)), this, SLOT (handleButton(int)));
for (int i = 0; i < model->rowCount(); i++)
{
button = new QPushButton;
button->setText("Disconnect " + QString::number(i));
button->setStyleSheet("QPushButton { color: #E5E5E5; }");
ui->tableView->setIndexWidget(model->index(i,2, QModelIndex()), button);
QObject::connect(button, SIGNAL(released()), mapper, SLOT(map()));
mapper->setMapping(button, i);
}
}
hpp代码:
#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP
namespace Ui {
class MainWindow;
}
class MainWindow : public QDialog
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void onLanguageChanged();
void handleButton(int row);
void onRowsNumberChanged();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_HPP
在正常情况下,代码可以正常运行。但是,当插入新行和/或删除旧行时,按钮不会按需要出现在最后一列中。我试图使用信号-
connect(ui->tvServStat->model(), SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(onRowsNumberChanged()));
connect(ui->tvServStat->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(onRowsNumberChanged()));
两者的插槽都与
onRowsNumberChanged()
相同,在该插槽中,我再次尝试在最后一列中插入按钮。我的想法是,行数可能正在更改,因此我正在重新实现相同的逻辑。但是,它不起作用。任何人都可以帮助纠正我的逻辑或其他逻辑以实现此功能。提前致谢!
最佳答案
您应该对该列使用delegate。这样, View 将自动处理行的创建/删除。参见this question
您的代码还存在其他一些问题:
rowsInserted
/ rowsRemoved
onRowsNumberChanged
循环关于c++ - 在模型动态插入和删除QTableView中的行时发出信号/槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45876789/