• 5340阅读
  • 6回复

怎么移动一个窗口到屏幕的中间 [复制链接]

上一主题 下一主题
离线jorneyr
 

只看楼主 倒序阅读 楼主  发表于: 2009-04-24
我有一个窗口, 开始是在屏幕的中间, 但是后来窗口的大小发化了变化, 因为窗口中的组件是动态添加的, 此时, 怎么才能把这个窗口自动定位到屏幕的中间呢?
我用了下面的方法来处理, 但是取得的窗口大小不对:

class WidgetUtil {
public:
    static void moveWidgetToScreenCenter(QWidget *widget) {
        // 取得屏幕大小和窗口的大小
        QSize screenSize = QApplication::desktop()->size();
        QSize widgetSize = widget->frameGeometry().size();
        qDebug() << widgetSize;

        // 计算此时窗口左上角的位置
        int x = (screenSize.width() - widgetSize.width()) / 2;
        int y = (screenSize.height() - widgetSize.height()) / 2;
        qDebug() << QString("x: %1, y: %2").arg(x).arg(y);

        // 移动窗口到计算好的位置
        widget->move(x, y);
    }
};

当窗口的大小在动态添加组件后发生了变化, 然后调用这个方法, 但是最后还是不行, 左上角的位置并没有变化, 即取得窗口的大小widget->frameGeometry().size()这个函数返回的仍然是窗口大小发生变化前的大小, 并不是发生变化后的大小.

这个问题要怎么解决呢?

谢谢!
离线lj_0212

只看该作者 1楼 发表于: 2009-04-24
不是有resizeevent吗?
离线jorneyr

只看该作者 2楼 发表于: 2009-04-24
使用窗口大小改变事件, 还是不行:
void ChangeCustomerInfoDialog::resizeEvent(QResizeEvent *event) {
    qDebug() << "窗口大小改变了";
    qDebug() << size();

    QSize screenSize = QApplication::desktop()->size();
    QSize widgetSize = this->size();

    int x = (screenSize.width() - widgetSize.width()) / 2;
    int y = (screenSize.height() - widgetSize.height()) / 2;
    qDebug() << QString("移动窗口到[x: %1, y: %2]").arg(x).arg(y);
    this->move(x, y);
}

窗口大小改变后的输出信息:
窗口大小改变了
QSize(240, 156)
"移动窗口到[x: 600, y: 372]"  // 第一次显示窗口, 移动成功.
Delete LoginWidget
窗口大小改变了
QSize(2, 2)
"移动窗口到[x: 719, y: 449]" // 删除第一个组件, 移动成功
窗口大小改变了
QSize(356, 513)
"移动窗口到[x: 542, y: 193]" // 再添加一个组件后, 也进行了移动, 但是移动不成功, 此时输出计算结果是正确的, 但是窗口移动的使用的大小通过观察系统仍是使用QSize(2, 2)来计算, 非常奇怪.
离线jorneyr

只看该作者 3楼 发表于: 2009-04-24
我怀疑是第二次移动事件被系统丢弃了, 不知道应该怎么强制使得这个移动事件被系统执行.
离线lj_0212

只看该作者 4楼 发表于: 2009-04-24
呃,要不然再重载moveevent,看看到底要求移动了没有?
离线jorneyr

只看该作者 5楼 发表于: 2009-04-24
问题用另一种方法解决了, 在删除组件之前把窗口隐藏, 添加好新的组件后显示窗口, 移动窗口函数在resizeEvent函数中进行.
但是从外部取得窗口的大小还是没变, 好奇怪.
离线lj_0212

只看该作者 6楼 发表于: 2009-04-24
这样会不会闪烁?
快速回复
限100 字节
 
上一个 下一个