c++ - 静态 qt 对话框窗口不可能?

标签 c++ qt modal-dialog static-members

似乎每当我尝试将 qt 对话框屏幕“存储”到静态变量中时,程序就会崩溃。 (调试错误提示无法在 QMainApplication 之前创建 QPaintDevice)。

由于这个错误发生在进入 main was 循环之前,我认为问题出在静态变量上。 (好吧,这是自上次构建以来我添加的唯一内容)。

让我先试着解释一下我是如何使用它的。基本上我有一棵树(来自一些外部 -xml- 文件)。我希望显示该树的数据。然而,根据树中的实际位置,必须以不同方式绘制数据。 (使用完全不同的对话框)。

所以我开始创建的是静态 map 。该 map 将树“位置”作为关键(“regexified”为“a * c d”之类的东西 - 空格表示分支)。作为值(value),应该指出正确的对话。

第一个想法是简单地使用指向对话框屏幕的指针。 (然后查找变量的函数只是执行对话框屏幕)。然而,这导致了上面显示的错误。

现在我开始使用一个中间代理函数,该函数只是创建对话框屏幕并调用它。而静态映射只是持有指向这个函数的指针。像这样的东西:

int AskGUIFn::GenStd(const GMProject::pTree& tOut, const GMProject::pTree& tIn) const {
    std::unique_ptr<MW::GenStd> box(new MW::GenStd(&tOut, &tIn));
    return box->exec();
}

然而,这看起来非常冗长(我不仅必须创建所有模式窗口,而且还必须为每个对话框屏幕添加另一个代理函数)。有没有更清洁的方法来做到这一点?我想阻止使用代理功能?

最佳答案

静态 QWidget 是不可能的 - QApplication 对象必须在 QWidget 之前创建。另外,静态变量未定义的初始化和销毁​​顺序会造成麻烦。另请注意,如果您有其他窗口可见(例如主窗口),您应该始终将父级传递给模态对话框,否则窗口堆叠将在某些平台上显示令人讨厌的行为(禁用窗口后面的模态对话框等)。像 kenrogers 一样,我建议使用像这样的工厂函数:

QDialog* createDialogForNodeType( const QString& type, ...tree data, QWidget* parent );

关于c++ - 静态 qt 对话框窗口不可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9469735/

相关文章:

c++ - 基于文件路径/名称创建 QTreeWidget 目录?

Javascript模态可拖动弹出窗口

c++ - 显示字符串的最后 n 个字符

C++:引用和指针问题(关于 OpenGL 的示例)

qt - qt sqlite select语句

matlab - 如何在 MATLAB 模态中制作等待栏

ios - 使用 iOS 6 自动布局,在 UINavigationController 上方显示某些内容的正确方法是什么?

c++ - 在 C++ 代码中检测双重释放

c++ - 遇到值时中断

c++ - 使用操作系统定义的默认文件对话框的 QFileDialog 替代方案?