从QDialog调用QMainWindow中的方法

Call method in QMainWindow from QDialog

本文关键字:方法 QMainWindow QDialog 调用      更新时间:2023-10-16

我运行这个程序是为了显示来自main的对话框窗口:

void SQLWindow::on_action_4_triggered()
{ 
   HeaderList window; 
   window.show(); 
   window.exec(); 
}

在这里,我试图将saveButtonClicked()连接到主窗口中的SLOT:

HeaderList::HeaderList(QWidget *parent) : QDialog(parent), ui(new Ui::HeaderList) 
{ 
   connect(this, SIGNAL(saveButtonClicked()), SQLWindow, SLOT(hideColumns())); 
   ui->setupUi(this); 
}

但是得到了一个错误:"在','标记之前应该有主表达式",它指向"SQLWindow"。很明显,我做错了。有什么想法可以从对话框调用主窗口中的方法吗?

connect(…)中的第三个参数需要是指向实例的指针。只需更改HeaderList构造函数的签名并添加SQLWindow作为参数(+使用TheDarkKnight提到的较新的连接方法调用):
HeaderList::HeaderList(SQLWindow *parent) : QDialog(parent), ui(new Ui::HeaderList)
{
    connect(this, &HeaderList::saveButtonClicked, parent, &SQLWindow::hideColumns);
    ui->setupUi(this);
}

在头文件中,最好使HeaderList构造函数显式,而不是用nullptr:重载父级

class HeaderList
{
public:
    explicit HeaderList(SQLWindow *parent);
    //...
};

将SQLWindow传递到HeaderList(并省略thuga提到的show()):

void SQLWindow::on_action_4_triggered()
{
    HeaderList window(this);
    window.exec();
}

以其他方式连接信号,如下所示:

class HeaderList
{
public:
    explicit HeaderList(QWidget *parent);
signals:
    void saveButtonClicked();
};

现在处于SQLWindow

void SQLWindow::on_action_4_triggered()
{ 
   HeaderList window; 
   connect(&window, SIGNAL(saveButtonClicked()), this, SLOT(hideColumns()));
   window.exec(); 
}