[英]Change window position on show() in Qt
I know the process to re-position a window when I am creating an object of it from the current window( currWindow
) as follows: 我知道从当前窗口( 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();
I have a similar code for currWindow
as well. 我也有类似的currWindow
代码。 However I have a back button in targetwindow
which hides the targetwindow
and show()
the currWindow
. 但是我在targetwindow
有一个后退按钮,它隐藏了targetwindow
并show()
currWindow
。 I have implemented this using a signal slot mechanism as follows: 我已经使用信号插槽机制实现了这一点,如下所示:
connect(targetwindow,&TargetWindow::pressTargetWindowGoBackButton,
this,&CurrentWindow::show);
The problem is after pressing the back button on targetwindow
the currWindow
shows but does not maintain the position I had set for it before(ie middle of screen). 问题是,按下后退按钮后targetwindow
的currWindow
显示,不维护我以前为它设置的位置(即屏幕中间)。 I tried to correct it by adding code for positioning it in the paint event using this operator but it doesn't work: 我试图通过使用此运算符添加用于在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);
}
How do I do this? 我该怎么做呢? Do I need to override the pre-defined show() function and how? 我需要重写预定义的show()函数吗?如何重写?
Edit : Adding code of my project. 编辑 :添加我的项目的代码。 Here currentwindow -> MainWindow and targetwindow->Dialog. 这里是currentwindow-> MainWindow和targetwindow-> Dialog。
dialog.h 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 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 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 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 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 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 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>
If you go on a OK->Back->OK loop in this you will find main window keeps shifting upwards. 如果您在其中执行OK-> Back-> OK循环,您会发现主窗口一直在向上移动。
Did you try the setGeometry() function of targetwindow: 您是否尝试过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.