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

时间:2016-11-03 16:44:11

标签: c++ qt

环境:

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

问题:

我有一个主窗口。在其中,一些容器级别向下,是一个gui元素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

这有点轻微,它必须适用于多显示器计算机。似乎有些定位是相对于主显示器而言,这是我需要的病态 - 对话框必须相对于应用程序而不是主显示器结束。我已经尝试过这些东西来获取位置,然后干涸:

var routerApp = angular.module("routerApp", ['ui.router']);
routerApp.config( [  '$stateProvider', '$urlRouterProvider', 
// -------------- ^  ---------------
function($stateProvider, $urlRouterProvider) {
    $urlRouterProvider.otherwise('/');
    $stateProvider
    .state('table', {
        url : '/',
        templateUrl : 'views/table.html'
    });
}   ]   );
//  ^ and this -------

欣赏任何见解。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

所以,我得到了我想要的一切,虽然显然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
}