Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何防止Qt或skip中的currentCellChanged信号;处理“;?_C++_Qt_Qt5_Qtablewidget - Fatal编程技术网

C++ 如何防止Qt或skip中的currentCellChanged信号;处理“;?

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))); 打开文件时

我有一个菜单项和一个带插槽的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)));
打开文件时,我试图通过使用标志变量阻止在插槽中执行任何操作:

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);
}