qt 4.7 - 在父窗口中的特定位置定位对话框

Posted

技术标签:

【中文标题】qt 4.7 - 在父窗口中的特定位置定位对话框【英文标题】:qt 4.7 - position dialog at specific position in parent window 【发布时间】:2016-11-03 16:44:11 【问题描述】:

环境:

XP 及更高版本,OS X 10.6.8 及更高版本 Qt 4.7.1 64 位,在 OS X 10.6.8 下构建 Qt Creator 2.1.0

问题:

我有一个主窗口。在其中,一些容器水平下降,是一个gui元素cb_B_8,一个按钮。我可以通过这种方式获得该元素的位置和大小,并且它恰好相对于其标题栏下的主窗口区域(theParent 是主窗口实例):

QPoint buttpos = theParent->ui->cb_B_8->pos(); // = 473,576
QRect  butrect = theParent->ui->cb_B_8->rect(); // = 0,0,32,26

这对我来说很有意义。

所以现在我这样打开一个对话框:

void MainWindow::mybandersnatch(int i)

setband *tt;
    tt = new setband(this,i);
    tt->show();
    tt->raise();

对话框开始如下:

setband::setband(QWidget *parent, int bindex) :
QDialog(parent),
ui(new Ui::setband)

    theParent = parent; // dialog local copy of parent
    ...

它在我的主窗口中心打开 (theParent)

我想重新定位此对话框,使对话框窗口的顶部直接位于按钮的下边缘下方。

我无法检索对话框相对于其父窗口的位置;而且我也无法相对于该窗口定位对话框。我尝试了一些看似可能但结果空洞的事情。

从概念上讲,考虑到我有按钮相对于窗口的位置,如果我有对话框相对于窗口的位置,并且同样可以相对于窗口进行设置,我想准确地设置它这样:

newDialogYpos = button.yPos + button.yHeight; // below button

buttonXcenter = button.xPos + (button.width / 2);
dialogHalfWidth = dialog.width / 2;
newDialogXpos = buttonXcenter - dialogHalfWidth;

对此的一个小改动是它必须在多显示器计算机上工作。似乎某些定位是相对于主显示的,这对我的需求来说是病态的——对话框最终必须相对于应用程序,而不是主显示。我已经尝试过这些事情来获得职位,并且干了起来:

t = this->rect(); // = 0,0 410x320 (dialog)
dp = this->pos(); // = 0,0 (dialog)
ap = QApplication::desktop()->screen()->pos(); // = 0,0 ?
mtp = this->window()->mapFromParent(tmw->pos()); // = 0,0 ?

// main display is 1680x1050, app is not on this display
// this display is 1280x1024 (I have 8 displays on this machine)
// this display is immediately to the right of the main display
// app window is fullscreen, so at top left of 1280x1024 display
// this result seems to incorporate other display positions + widths:
// ------------------------------------------------------------------
w = QApplication::desktop()->screen()->rect(); // = 0,0 3080x1050

欣赏任何见解。

【问题讨论】:

【参考方案1】:

所以,我得到了我所要求的一切,尽管显然 Qt 获取标题栏高度的方法被破坏了。以下适用于我系统中的所有八台显示器:

void setband::positionDialog()

QPoint mw; // mainwindow position
QPoint bp; // button position
QRect r;   // button rect
QRect d;   // dialog rect
QPoint sp; // target position of all this
QPoint addend; // the delta required to move from dialog position
int tbh; // titlebar height (qt returns 0 for this, sigh)

    bp = theParent->ui->cb_B_11->pos();                 // = 473,576
    mw = theParent->pos();                              // = 1600,0
    d = this->rect();                                   // = 0,0 410x320 (dialog)
    r = theParent->ui->cb_B_11->rect();                 // = 0,0 32,26
    addend.setX(-((d.width() / 2) - (r.width() / 2)));  // position dialog centered on X re button
//  tbh = QApplication::style()->pixelMetric(QStyle::PM_TitleBarHeight); // get title bar height returns 0?!?
    tbh = 25;                                           // use bloody guesswork, then
    addend.setY(tbh + r.height());                      // need to move past button pos+height+titlebarHeight
    sp = mw + bp + addend;                              // combine all this
    this->move(sp);                                     // and move

【讨论】:

您可能需要考虑到,对于 Windows,rect() 和 geometry() 是不同的东西【参考方案2】:

一个小部件在另一个内部的pos 位于其父级的坐标系中。 您需要使用父级的mapToGlobal() 来获取屏幕坐标。

【讨论】:

mtp = this->mapToParent(this->pos()); 返回0,0 mtp = this->mapToParent(bp); 返回473,576,我已经有了一个相对坐标。如何使用它来获取 DIALOG 位置,然后设置对话框位置? 要清楚,我已经有了按钮相对于其父级的位置。我确实没有拥有对话框相对于其父级的位置,也无法设置对话框相对于其父级的位置。事实上,我能够在 WRT 对话框中检索到的唯一位置是 0,0 您可以使用move()设置对话框的位置 没有this->setPos() 方法 -- 等等,你编辑了...让我试试

以上是关于qt 4.7 - 在父窗口中的特定位置定位对话框的主要内容,如果未能解决你的问题,请参考以下文章

007_Qt 中的坐标系统

使用QT 4.7 - 对话框正忙着加载一件大事;如何禁用所有控件?

QT之坐标系统

Qt学习五 - 对话框

qt - 在父窗口/小部件类中初始化子小部件的目的是啥?

如何将自定义对话框定位在特定坐标?