似乎每当我尝试将 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/