簡體   English   中英

在Qt中更改show()上的窗口位置

[英]Change window position on show() in Qt

我知道從當前窗口( currWindow )創建窗口對象時重新currWindow窗口的currWindow ,如下所示:

QDesktopWidget widget;
QRect screenGeometry = widget.screenGeometry();
int height = screenGeometry.height();
int width = screenGeometry.width();
//set to middle of screen
targetwindow->move((width - targetwindow->width()) / 2.0,
                (height - targetwindow->height()) / 2.0);
targetwindow->show();

我也有類似的currWindow代碼。 但是我在targetwindow有一個后退按鈕,它隱藏了targetwindowshow() currWindow 我已經使用信號插槽機制實現了這一點,如下所示:

connect(targetwindow,&TargetWindow::pressTargetWindowGoBackButton,
                                           this,&CurrentWindow::show);

問題是,按下后退按鈕后targetwindowcurrWindow顯示,不維護我以前為它設置的位置(即屏幕中間)。 我試圖通過使用此運算符添加用於在paint事件中定位它的代碼來糾正它,但它不起作用:

void currWindow::paintEvent(QPaintEvent *pe)
{

        QDesktopWidget widget;
        QRect screenGeometry = widget.screenGeometry();
        int height = screenGeometry.height();
        int width = screenGeometry.width();
        this->move((width - this->width()) / 2.0,
                        (height - this->height()) / 2.0);
}

我該怎么做呢? 我需要重寫預定義的show()函數嗎?如何重寫?

編輯 :添加我的項目的代碼。 這里是currentwindow-> MainWindow和targetwindow-> Dialog。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

signals:
    void goBack();
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "dialog.h"
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    Dialog *dia;
};

#endif // MAINWINDOW_H

main.cpp中

#include "mainwindow.h"
#include <QApplication>
#include <QDesktopWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    QDesktopWidget widget;
    QRect screenGeometry = widget.screenGeometry();//.availableGeometry(widget.primaryScreen());

    int height = screenGeometry.height();
    int width = screenGeometry.width();
    w.move(-50000,-50000);

    w.move((width - w.width()) / 2.0,
                    (height - w.height()) / 2.0);
    w.show();
    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDesktopWidget>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    dia=new Dialog;
    connect(dia,&Dialog::goBack,this,&MainWindow::show);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{

    QDesktopWidget widget;
    QRect screenGeometry = widget.screenGeometry();//.availableGeometry(widget.primaryScreen());

    int height = screenGeometry.height();
    int width = screenGeometry.width();
    dia->move(-50000,-50000);
//    dia->show();
    dia->move((width - dia->width()) / 2.0,
                    (height - dia->height()) / 2.0);
    dia->show();
    hide();
}

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_clicked()
{
    emit goBack();
    hide();
}

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>900</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>150</x>
      <y>90</y>
      <width>201</width>
      <height>141</height>
     </rect>
    </property>
    <property name="text">
     <string>OK</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>900</width>
     <height>19</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

dialog.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>900</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>370</x>
     <y>120</y>
     <width>231</width>
     <height>151</height>
    </rect>
   </property>
   <property name="text">
    <string>BACK</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

如果您在其中執行OK-> Back-> OK循環,您會發現主窗口一直在向上移動。

您是否嘗試過targetwindow的setGeometry()函數:

int height = screenGeometry.height();
int width = screenGeometry.width();
int x=(width - w.width()) / 2.0;
int y=(height - w.height()) / 2.0;
w.setGeometry(x,y,w.width(),w.height());
w.show();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM