C++ 如何防止Qt或skip中的currentCellChanged信号;处理“;?
我有一个菜单项和一个带插槽的QTableWidget:C++ 如何防止Qt或skip中的currentCellChanged信号;处理“;?,c++,qt,qt5,qtablewidget,C++,Qt,Qt5,Qtablewidget,我有一个菜单项和一个带插槽的QTableWidget: connect(ui->actionOpen, &QAction::triggered, this, &MainWindow::open); connect(ui->fooTableWidget, SIGNAL(currentCellChanged(int, int, int, int)), this, SLOT(checkFooChanged(int, int, int, int))); 打开文件时
connect(ui->actionOpen, &QAction::triggered, this, &MainWindow::open);
connect(ui->fooTableWidget, SIGNAL(currentCellChanged(int, int, int, int)),
this, SLOT(checkFooChanged(int, int, int, int)));
打开文件时,我试图通过使用标志变量阻止在插槽中执行任何操作:
void MainWindow::open()
{
flag = false;
ui->fooTableWidget->insertRow(0);
ui->fooTableWidget->insertRow(1);
flag = true;
}
void MainWindow::checkFooChanged(int row, int, int previousRow, int)
{
if (flag && row != previousRow)
{
qDebug() << "processing";
// do something here
}
}
void主窗口::open()
{
flag=false;
ui->fooTableWidget->insertRow(0);
ui->fooTableWidget->insertRow(1);
flag=true;
}
void main window::checkFooChanged(int行,int,int前一行,int)
{
如果(标志和行!=上一行)
{
qDebug()setupUi(此);
ui->fooTableWidget->setColumnCount(1);
连接(ui->actionOpen,&QAction::triggered,this,&MainWindow::open);
连接(ui->fooTableWidget,信号(currentCellChanged(int,int,int,int,int)),
这个插槽(checkFooChanged(int,int,int,int,int));
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void main window::checkFooChanged(int行,int,int前一行,int)
{
qDebug()插入行(0);
QTableWidgetItem*项目;
item=新的QTableWidgetItem();
ui->fooTableWidget->setItem(0,0,item);
item->setText(“哦,你好!”;
ui->fooTableWidget->blockSignals(假);
}
因此,问题似乎是由主窗口重新获得焦点引起的。在您的情况下,我发现您希望暂时禁用
currentCellChanged
信号触发器,为此,您必须使用blockSignals()
:
更新: 正如您所指出的,问题似乎是由焦点更改引起的,当您打开对话框时,焦点被消除,当焦点关闭时,它返回到
centralWidget
,产生意外的效果,一种可能的解决方案是在主窗口中建立焦点
void MainWindow::open()
{
QString fileName;
fileName = QFileDialog::getOpenFileName(this, tr("Open"), "", "(*.emx)");
if (fileName.isEmpty())
return;
setFocus(); //<--
ui->fooTableWidget->blockSignals(true);
ui->fooTableWidget->setRowCount(0);
ui->fooTableWidget->insertRow(0);
QTableWidgetItem *item = new QTableWidgetItem();
ui->fooTableWidget->setItem(0, 0, item);
item->setText("Oh hi there!");
ui->fooTableWidget->blockSignals(false);
}
void主窗口::open()
{
QString文件名;
fileName=QFileDialog::getOpenFileName(this,tr(“Open”)、“”、“(*.emx)”);
if(fileName.isEmpty())
返回;
setFocus();//fooTableWidget->blockSignals(true);
ui->fooTableWidget->setRowCount(0);
ui->fooTableWidget->insertRow(0);
QTableWidgetItem*item=新的QTableWidgetItem();
ui->fooTableWidget->setItem(0,0,item);
item->setText(“哦,你好!”;
ui->fooTableWidget->blockSignals(假);
}
我无法实现此功能,在open完成后仍会调用checkFooChanged。@tyebillion您确定这是生成调用的代码吗?我想这是代码的另一部分,请提供:)我试图隔离问题,但失败了。这就像是另一个事件导致触发信号一样,但是不管是什么,我似乎无法将其隔离。@tyebillion然后与我共享您的项目,我将看到问题所在,但我无法帮助您。:)好的,我必须在我的程序上进行分而治之的过程来隔离问题。
void MainWindow::open()
{
ui->fooTableWidget->blockSignals(true);
ui->fooTableWidget->insertRow(0);
ui->fooTableWidget->insertRow(1);
ui->fooTableWidget->blockSignals(false);
}
void MainWindow::open()
{
QString fileName;
fileName = QFileDialog::getOpenFileName(this, tr("Open"), "", "(*.emx)");
if (fileName.isEmpty())
return;
setFocus(); //<--
ui->fooTableWidget->blockSignals(true);
ui->fooTableWidget->setRowCount(0);
ui->fooTableWidget->insertRow(0);
QTableWidgetItem *item = new QTableWidgetItem();
ui->fooTableWidget->setItem(0, 0, item);
item->setText("Oh hi there!");
ui->fooTableWidget->blockSignals(false);
}