【问题标题】:QDialogButtonBox button Ok not woking after connectingQDialogBu​​ttonBox按钮确定连接后不起作用
【发布时间】:2015-01-20 18:22:51
【问题描述】:

我有一个 mainWindow 类,它在双击 QTabBar 时调用函数 mainWIndow::ShowDialogBox()。对话框出现,但没有连接按钮。我在 ShowDialogBox 中有连接调用。它给我一个红色下划线连接说

 no instance of overloaded function "MainWindow::connect" matches the argument list"

这是我的代码

bool MainWindow::eventFilter(QObject *object, QEvent *event)
 {
    if (object == mTabWidget->getTabBar() && event->type() == QEvent::MouseButtonDblClick) 
    {
        qDebug()<<"dblclk";

    ShowDialogBox();

    }

    return QObject::eventFilter(object, event);
}

//Show dialog box when double clicked on QTabBar
void MainWindow::ShowDialogBox(){

    QDialog dialog;
    QVBoxLayout layout(&dialog);
    QLineEdit editLine;
    layout.addWidget(&editLine);

     QDialogButtonBox *dialogButton = new QDialogButtonBox(QDialogButtonBox::Ok );
     connect(dialogButton, SIGNAL(accepted()), dialog, SLOT(accept())); //this 'connect' is underlined
     layout.addWidget(dialogButton);
     dialog.setLayout(&layout);


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

  }

我在 mainWindow.h 中添加了信号和槽

private slots:
    void accept();

signals:

    void accepted();

我在这上面花了几个小时,但没有运气。我是 Qt 新手。

【问题讨论】:

  • 你有没有自己实现的MainWindow::connect函数?
  • @luliu :不。我们必须这样做吗?正如我所说,我是新人,所以无法真正弄清楚。
  • 否...MainWindow 是否继承 QMainWindow?如果将 connect 替换为 QObject::connect 会发生什么?
  • @luliu 是的,它继承了QMainWindow。当我用 QObject::connect 替换 connect 时,它会给出错误 no instance of overloaded function QObject::connect matches the argument list"
  • 您是否尝试过运行qmake(Build->Run qmake) 然后进行重建?

标签: signals-slots qt-designer qdialog


【解决方案1】:

行:

connect(dialogButton, SIGNAL(accepted()), dialog, SLOT(accept()));

应该是:

connect(dialogButton, SIGNAL(accepted()), &dialog, SLOT(accept()));

因为第三个参数必须是内存地址(指针)。

【讨论】:

  • 谢谢。连接现在可以工作,但随后窗口立即关闭,并给出错误提示 Unhandled exception 并且断点位于文件 qscopedpointer.h 中的行 inline T *data() const { return d; }
  • 我无法理解为什么它给我一个错误。它与信号和插槽有什么关系吗?因为我刚刚声明了插槽,没有定义它们,因为它们是标准插槽。我在这里做错了吗?
  • @user2 我不是 100% 确定,但问题可能是由行 dialog.setLayout(&amp;layout); 引起的。阅读QWidget::setLayout 文档,其中说An alternative to calling this function is to pass this widget to the layout's constructor. 会告诉您将dialog 传递给layout 的构造函数并调用setLayout 相当于设置布局两次,这在Qt 中是一个非常糟糕的主意.我建议您删除行dialog.setLayout(&amp;layout); 或将行QVBoxLayout layout(&amp;dialog); 更改为QVBoxLayout layout;。让我知道它是否有效。
  • 我试过你说的,它仍然给出相同的未处理异常错误。除此之外,当我将插槽声明为accept(); 时,它不会编译并给出未解决的外部符号错误以供接受。但是,当我将其更改为 accept(){} 时,它会编译但在运行时再次给出未处理的异常。
  • @user2 您是否在cpp 文件中实现了accept()
猜你喜欢
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多