我在写这篇文章之前搜索过很多东西。我发现了几个帖子,但我无法得到它们。所以我开始了一个新职位。
我正在开发一个简单的UI。有这个主要类(见下文),它是一个主对话框,在应用程序启动时显示。
class MainWindow : public QMainWindow
MainWindow
对话框上的按钮很少,当我点击按钮时,它会隐藏MainWindow
并打开另一个QDialog
框。此对话框属于如下所示的类
class libinsert : public QDialog
我以这种方式创建libinsert
对象:
void MainWindow::on_pushButton_clicked()
{
this->hide();
libinsert lib; // I create libinsert object this way
lib.setModal(true);
lib.exec();
}
这是libinsert.cpp
:
libinsert::libinsert(QWidget *parent) :
QDialog(parent),
ui(new Ui::libinsert)
{
ui->setupUi(this);
}
当libinsert
对话框打开时,我需要访问一个class MainWindow
成员的套接字变量。我如何实现这一目标?
我的主应用程序看起来像这样:
{
QApplication a(argc, argv);
MainWindow w(sock);
w.show();
return a.exec();
};
或者:一般来说,如何构建多个对话框作为父子关系?
答案 0 :(得分:1)
libinsert不会是MainWindow的孩子。基于QDialog的窗口始终是顶级窗口,无论您在构造它们时将其作为父窗口传递的内容。
如果在任何给定时间只存在MainWindow的单个实例(每个进程),您可以为MainWindow提供一个静态函数,该函数返回指向该窗口的指针:
class MainWindow : public QMainWindow
{
public:
MainWindow()
{
theWindow = this;
}
virtual ~MainWindow()
{
theWindow = nullptr;
}
static get()
{
return theWindow;
}
static MainWindow *theWindow;
}
MainWindow *MainWindow::theWindow = nullptr;
然后,您的对话框可以访问主窗口的成员:
MainWindow::get()->someMemberFunction();
更强大的方法是让libinsert在创建时存储指向主窗口的指针:
class MainWindow;
class libinsert : public QDialog
{
public:
libinsert(MainWindow *mw)
: mainWindow(mw)
{ ... }
MainWindow *getMainWindow()
{
return mainWindow;
}
MainWindow *mainWindow;
}
当MainWindow创建对话框时,它会将指向自身的指针传递给构造函数:
void MainWindow::createDialog()
{
libinsert *dialog = new libinsert(this):
}
即使MainWindow的多个实例同时处于活动状态,此方法仍然有效。