Gtk对话框按钮无响应

时间:2014-11-19 21:17:49

标签: c++ qt

对话框打开,有两个按钮,确定和取消。没有任何按钮响应用户点击。我必须按右上角的X取消对话框。

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == mTabWidget && event->type() == QEvent::MouseButtonDblClick) 
    {
        // query and set tab(s) names
        QTabWidget *tab = qobject_cast<QTabWidget *>(obj);
        if(tab)
        {
            QDialog dlg;
            QVBoxLayout la(&dlg);
            QLineEdit ed;
            la.addWidget(&ed);
            QDialogButtonBox bb(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
            la.addWidget(&bb);
            dlg.setLayout(&la);
            if(dlg.exec() == QDialog::Accepted)
            {
                tab->setTabText(0, ed.text());
                return true;
            }
        }
    }

    // Standard event processing
    return QObject::eventFilter(obj, event);
}

我错过了connect()行或信号吗?我试着阅读Qt文档,但据我所知,调用QDialogButtonBox::OK被处理为已接受。

更新:

新对话功能

好的,我已经创建了一个处理对话框的新函数,我从事件函数中调用它。它仍然没有响应,现在在终端上,我看到一个错误,说:没有这样的插槽MainWindow :: accept()和另一个拒绝。我知道我在.h文件中没有这两个插槽。我试图找到如何建立插槽,但我不能,任何帮助都会很棒。谢谢

void MainWindow::initializeBOX()
{
 QDialog dlg;
        QVBoxLayout la(&dlg);
        QLineEdit ed;
        la.addWidget(&ed);


        //QDialogButtonBox bb(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
        //btnbox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
         QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok |                QDialogButtonBox::Cancel);

         connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
         connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));

         la.addWidget(buttonBox);
         dlg.setLayout(&la);


        if(dlg.exec() == QDialog::Accepted)
        {
            mTabWidget->setTabText(0, ed.text());
        }

       }

1 个答案:

答案 0 :(得分:0)

不是从事件文件管理器启动对话框,而是通过在代码中重载该虚函数来捕获QWidget::mouseDoubleClickEvent。只要它是一个回调,你就可以立即从那里做更多的事情,包括对话。或者可能将信号发送到执行对话的插槽(更清洁)。我会从mouseDoubleClickEvent事件处理程序执行信号并使父QWidget :: mouseDoubleClickEvent使用该事件以避免可能的复杂情况,尤其是在将代码移植到其他平台时。

事件过滤器用于非标准事件处理。你的情况没有任何不标准。