我有一个QGraphicsView子类,在该子类中,在项的上下文菜单上,我想显示一个属性对话框。
我希望对话集中在视野中.
正如我现在拥有的,没有父级,它显示在屏幕的中心。
MyView::MyView(QWidget *parent) : QGraphicsView(parent) {}
void MyView::showProperties()
{
TabDialog *tabDialog = new TabDialog(); // shows in center of screen
// TabDialog *tabDialog = new TabDialog(this); // doesn't show at all
// TabDialog *tabDialog = new TabDialog((QWidget*)this->parent()); // doesn't show at all
tabDialog->setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint);
tabDialog->exec();
delete tabDialog;
}
视图被放在一个群组盒子里..。家长就是群盒..。
如何使用父级调用对话框?
发布于 2015-06-30 17:09:22
您必须将对话框设置为顶级窗口,而不仅仅是嵌入在视图中的子部件。您的setWindowsFlags
调用重置对话框中的相关标志。你需要手动保存它们。
您也不应该使用exec()
重新进入事件循环,因为这要求您的许多其他代码也需要重入。
一个最小的修复看起来应该是:
void MyView::showProperties()
{
auto dialog = new TabDialog(this);
dialog->setWindowFlags(Qt::Dialog |
Qt::WindowCloseButtonHint |
Qt::WindowSystemMenuHint);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show();
}
也许您希望缓存对话框:
class MyView : public ... {
QPointer<TabDialog> m_tabDialog; // nulls itself when the dialog perishes
QTimer m_tabDialogTimer;
...
};
MyView::MyView(...) {
m_tabDialogTimer->setSingleShot(true);
...
}
void MyView::showProperties() {
if (! m_tabDialog) {
m_tabDialog = new TabDialog(this);
m_tabDialog->setWindowFlags(Qt::Dialog |
Qt::WindowCloseButtonHint |
Qt::WindowSystemMenuHint);
QObject::connect(&m_tabDialogTimer, &QTimer::timeout,
m_tabDialog, &QObject::deleteLater);
QObject::connect(m_tabDialog, &QDialog::finished, [&this](int){
// the dialog gets deleted 120 seconds after last use
m_tabDialogTimer.start(120);
});
}
m_tabDialogTimer.stop(); // reset pending timeout, if any
m_tabDialog->show();
}
https://stackoverflow.com/questions/31142195
复制相似问题