XP下资源管理器无法正常记忆窗口大小和位置,求解。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XP下资源管理器无法正常记忆窗口大小和位置,求解。相关的知识,希望对你有一定的参考价值。
不要说什么调整好之后关闭一次,那种方法太小儿科了,现在的问题是调整之后无法记忆!
虽然是很久以前的问题,我还是来解答一下吧,可能还有许多用XP的朋友在“文件夹选项”中,
“查看”->“在单独的进程中打开文件夹窗口”,就是这个复选框决定的。
也可用注册表控制,这是复位窗口默认大小和位置:
Windows Registry Editor Version 5.00
[-HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\Bags]
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]
"Window_Placement"=-
这是记忆窗口大小和位置的开关:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
NoSaveSettings=0
(值取0或1) 参考技术A 如果你尽力了还是解决不了,还是还原系统或重装(可能是出事前你操作出了问题,系统文件出了问题引起的,也可以将出事前下载的东西全部卸载试试)。追问
你这回答太过坑爹,解决不了我的问题,实在办不到给你满意
追答我自信在操作上比你水平高,我也是这样做的,电脑上的事不要较真,你就等着高人吧,我不缺你那点分。
追问那就此别过吧,我也不是很气你,比你菜的有的是,我给予的评价更一针见血,但咱俩彼此彼此,还是算了吧,分是没有的,因为我也回答别人从来不要分。
参考技术B 不是吧,难道有什么地方的数据是要设置的吗,你可以在控制面板里找找看有没有相关的设置参数啊追问我不是菜鸟
Qt布局管理器(详解)
1、存在的问题
(1)目前的GUI开发方式:绝对定位
--直接在像素级指定各个组件的位置和大小
void QWidget::move(int x, int y)
void QWidget::resize(int w, int h)
(2)问题
--组件位置和大小无法自适应父窗口的变化
2、布局管理器
(1)解决方案:布局管理器
--提供相关的类对界面组件进行布局管理
@1:能够自动排列窗口中的界面组件
@2:窗口变化后自动更新界面组件的大小
(2)QLayout是Qt中布局管理器的抽象基类
(3)通过继承QLayout实现了功能各异且互补的布局管理器
(4)Qt中可以根据需要自定义布局管理器
(5)布局管理器不是界面组件,而是界面部件的定位策略
QLayout 是Qt布局管理器中抽象的基类
QBoxLayout QGridLayout QFormLayout QStackedLayout这几个类都继承自QLayout。
(6)QBoxLayout布局管理器
--以水平或者垂直的方式管理界面组件
QBoxLayout
QVBoxLayout QHBoxLayout 有两个子类,一个是垂直管理界面组件的类,一个是水平管理界面组件的类。
(7)QVBoxLayout的使用(假设已经创建了四个按钮对象,test1,test2,test3,test4)
QVBoxLayout *layout = new QVBoxLayout(); //创建一个布局管理器对象
test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); //函数有两个参数,前一个参数是关于垂直的,后一个是关于水平的,这里设置的是垂直和
//水平的大小都会随着窗口的变化而变化
test1.setMinimumSize(160, 30); //设置这个按钮最小是160, 30
layout->setSpaceing(30); //调用布局管理器中的这个成员函数,可以设置部件的空间,间隔,部件之间的距离是30个像素
layout->addWidget(&test1); //将test1这个按钮部件添加到布局管理器,意思是让这个垂直的布局管理器进行管理
layout->addWidget(&test2); //将test2这个按钮部件添加到布局管理器,意思是让这个垂直的布局管理器进行管理
layout->addWidget(&test3); //将test3这个按钮部件添加到布局管理器,意思是让这个垂直的布局管理器进行管理
layout->addWidget(&test4); //将test4这个按钮部件添加到布局管理器,意思是让这个垂直的布局管理器进行管理
setLayout(layout); //调用setLayout函数设置布局管理器为这个layout
但是经过这几部的操作,我们发现界面跟着变大的时候,这几个按钮也会随着变化,但仅仅只是宽度的变化,而按钮的高度却没有随着主窗口的变化而变化,解决的方法有。
这时就用到了这个QSizePolicy类,继承自QWidget,因为QWidget是基类,这个类我们可以在Qt的帮助文档中详细的看,大概的意思就是一个大小的策略,是当有布局管理器存在的时候起作用。当布局管理器时
这个QSizePolicy类的大小的策略,就会被布局管理器所使用。大小策略的函数是setSizePolicy();
(8)水平管理器QHBoxLayout的使用和垂直管理器QVBoxLayout的使用方式一样
(9)布局管理器可以相互嵌套,形成更加复杂的布局方式。所以Qt中提供的四个布局管理器,可以相互的配合,完成几乎所有的常用的界面布局。
--布局嵌套几乎可以完成所有常用的界面布局
--自定义布局管理类可以达到个性化界面布局的效果
如:
#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent), Test1(this), Test2(this), Test3(this), Test4(this)
{
// testQVBoxLayout();
// testQHBoxLayout();
qiantao_QV_QHlayout();
}
void Widget::testQVBoxLayout() //垂直管理器的布局
{
Test1.setText("Test1Button");
Test2.setText("Test2Button");
Test3.setText("Test3Button");
Test4.setText("Test4Button");
Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); //设置大小策略,当有布局管理器时起作用,窗口变化
//按钮垂直和水平大小都会有扩展,不会只宽度变
Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test1.setMinimumSize(160, 30); //设置按钮最小的宽度和高度为160和30,不能在小了
Test2.setMinimumSize(160, 30);
Test3.setMinimumSize(160, 30);
Test4.setMinimumSize(160, 30);
QVBoxLayout *vlayout = new QVBoxLayout(); //创建一个垂直管理器的对象
vlayout->setSpacing(30); //设置这个布局管理器中的组件间间隔是30个像素
vlayout->addWidget(&Test1); //将这个按钮组件添加到vlayout这个垂直布局管理器中
vlayout->addWidget(&Test2);
vlayout->addWidget(&Test3);
vlayout->addWidget(&Test4);
setLayout(vlayout); //设置布局管理器为这个
}
void Widget::testQHBoxLayout() //水平管理器的布局
{
Test1.setText("Test1Button");
Test2.setText("Test2Button");
Test3.setText("Test3Button");
Test4.setText("Test4Button");
Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); //设置大小策略,当有布局管理器时起作用,窗口变化
//按钮垂直和水平大小都会有扩展,不会只宽度变
Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test1.setMinimumSize(160, 30); //设置按钮最小的宽度和高度为160和30,不能在小了
Test2.setMinimumSize(160, 30);
Test3.setMinimumSize(160, 30);
Test4.setMinimumSize(160, 30);
QHBoxLayout *hlayout = new QHBoxLayout(); //创建一个水平管理器的对象
hlayout->setSpacing(30); //设置这个布局管理器中的组件间间隔是30个像素
hlayout->addWidget(&Test1); //将这个按钮组件添加到vlayout这个垂直布局管理器中
hlayout->addWidget(&Test2);
hlayout->addWidget(&Test3);
hlayout->addWidget(&Test4);
setLayout(hlayout); //设置布局管理器为这个
}
void Widget::qiantao_QV_QHlayout() //嵌套的布局管理器,水平和垂直的嵌套
{
Test1.setText("Test1Button");
Test2.setText("Test2Button");
Test3.setText("Test3Button");
Test4.setText("Test4Button");
Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); //设置大小策略,当有布局管理器时起作用,窗口变化
//按钮垂直和水平大小都会有扩展,不会只宽度变
Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test1.setMinimumSize(160, 30); //设置按钮最小的宽度和高度为160和30,不能在小了
Test2.setMinimumSize(160, 30);
Test3.setMinimumSize(160, 30);
Test4.setMinimumSize(160, 30);
QVBoxLayout *vlayout = new QVBoxLayout();
QHBoxLayout *hlayout1 = new QHBoxLayout();
QHBoxLayout *hlayout2 = new QHBoxLayout();
hlayout1->setSpacing(20); //设置水平布局管理器1中的组件间隔是20个像素
hlayout2->setSpacing(20); //设置水平布局管理器2中的组件间隔是20个像素
hlayout1->addWidget(&Test1);
hlayout1->addWidget(&Test2);
hlayout2->addWidget(&Test3);
hlayout2->addWidget(&Test4);
vlayout->setSpacing(20); //设置垂直布局管理器中的两个布局管理器的间隔是20个像素
vlayout->addLayout(hlayout1); //添加管理布局时,要用addLayout,不能用addWidget了
vlayout->addLayout(hlayout2);
setLayout(vlayout); //告诉当前的窗口,有vlayout这个布局管理器来帮忙管理
}
Widget::~Widget()
{
}
/*************************************************************************************************************************************************/
3、布局管理器中的比例系数
(1)默认情况下以等比例的方式更新组件的大小(就是在窗口大小变化的时候,布局管理器管理的组件的大小变化是等比例的)
(2)可以自定义组件大小更新时的比例系数(就是在窗口大小进行变化的时候,布局管理器管理的组件其大小的变化可以自定义)
(3)QBoxLayout中的比例系数设置
--void setStretch(int index, int stretch) //第一个参数是当前布局管理器中(QBoxLayout)格子的下标,第二个参数是比例系数
--bool setStretchFactor(QWidget *Widget, int stretch) //第一个参数是当前QBoxLayout中的具体的组件,第二参数是比例系数
--bool setStretchFactor(QLayout *Layout, int stretch) //第一个参数是被嵌套的具体的布局管理器,第二个参数是比例系数
(4)void setStretch(int index, int stretch)函数的使用,通过下标(格子)来指定。
QVBoxLayout *layout = new QVBoxLayout();
layout->setStretch(0, 1); //设置布局管理器QVBoxLayout中的第0个格子的比例系数为1
layout->setStretch(1, 1);
layout->setStretch(2, 2);
layout->setStretch(3, 2);
layout->addWidget(&Test1); //将这个按钮组件添加到layout这个垂直布局管理器中
layout->addWidget(&Test2);
layout->addWidget(&Test3);
layout->addWidget(&Test4);
setLayout(layout); //设置布局管理器为这个
当窗口进行变化的时候,QVBoxLayout布局管理器中的四个test,大小的变化是1122的变化,比例系数是1:1:2:2
(5)bool setStretchFactor(QWidget *Widget, int stretch)函数的使用,指定具体的布局管理器中的组件
QVBoxLayout *layout = new QVBoxLayout();
layout->setStretchFactor(&Test1, 1); //设置布局管理器QVBoxLayout中的Test1这个组件的比例系数为1
layout->setStretchFactor(&Test2, 1);
layout->setStretchFactor(&Test3, 2);
layout->setStretchFactor(&Test4, 2);
layout->addWidget(&Test1); //将这个按钮组件添加到layout这个垂直布局管理器中
layout->addWidget(&Test2);
layout->addWidget(&Test3);
layout->addWidget(&Test4);
setLayout(layout); //设置布局管理器为这个
(6)bool setStretchFactor(QLayout *Layout, int stretch)函数的使用,指定布局管理器中嵌套的布局管理器,设置其的比例系数
QVBoxLayout *vlayout = new QVBoxLayout();
QHBoxLayout *hlayout1 = new QHBoxLayout();
QHBoxLayout *hlayout2 = new QHBoxLayout();
hlayout1->setSpacing(20); //设置水平布局管理器1中的组件间隔是20个像素
hlayout2->setSpacing(20); //设置水平布局管理器2中的组件间隔是20个像素
hlayout1->addWidget(&Test1);
hlayout1->addWidget(&Test2);
hlayout2->addWidget(&Test3);
hlayout2->addWidget(&Test4);
vlayout->setSpacing(20); //设置垂直布局管理器中的两个布局管理器的间隔是20个像素
vlayout->addLayout(hlayout1); //添加管理布局时,要用addLayout,不能用addWidget了
vlayout->addLayout(hlayout2);
vlayout->setStretchFactor(hlayout1, 1); //设置vlayout这个垂直的布局管理器中的hlayout1这个嵌套的水平管理器的比例系数为1
vlayout->setStretchFactor(hlayout2, 2); //设置vlayout这个垂直的布局管理器中的hlayout2这个嵌套的水平管理器的比例系数为2
setLayout(vlayout); //告诉当前的窗口,有vlayout这个布局管理器来帮忙管理
(7)组件的初始大小是独立于布局管理器设置的,因此不能保证组件的大小始终符合比例系数的设置(比如,开始的时候,设置了按钮的最小的大小,但是后面布局管理器接手管理这几个按钮
后,设置了按钮的变化的比例系数,但这样并不会让开始的时候,按钮的大小就是按照比例系数设置的那样的大小,而是我们开始时设置的按钮的最小的大小)
例:布局管理器的比例系数的设置,详细代码
#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent), Test1(this), Test2(this), Test3(this), Test4(this)
{
//testQVBoxLayout();
// testQHBoxLayout();
qiantao_QV_QHlayout();
}
void Widget::testQVBoxLayout() //垂直管理器的布局
{
Test1.setText("Test1Button");
Test2.setText("Test2Button");
Test3.setText("Test3Button");
Test4.setText("Test4Button");
Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); //设置大小策略,当有布局管理器时起作用,窗口变化
//按钮垂直和水平大小都会有扩展,不会只宽度变
Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test1.setMinimumSize(160, 30); //设置按钮最小的宽度和高度为160和30,不能在小了
Test2.setMinimumSize(160, 30);
Test3.setMinimumSize(160, 30);
Test4.setMinimumSize(160, 30);
QVBoxLayout *vlayout = new QVBoxLayout(); //创建一个垂直管理器的对象
vlayout->setSpacing(30); //设置这个布局管理器中的组件间间隔是30个像素
vlayout->addWidget(&Test1); //将这个按钮组件添加到vlayout这个垂直布局管理器中
vlayout->addWidget(&Test2);
vlayout->addWidget(&Test3);
vlayout->addWidget(&Test4);
vlayout->setStretch(0, 1); //设置vlayout这个布局管理器中的第0个格子的比例系数为1
vlayout->setStretch(1, 1);
vlayout->setStretch(2, 3);
vlayout->setStretch(3, 3);
setLayout(vlayout); //设置布局管理器为这个
}
void Widget::testQHBoxLayout() //水平管理器的布局
{
Test1.setText("Test1Button");
Test2.setText("Test2Button");
Test3.setText("Test3Button");
Test4.setText("Test4Button");
Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); //设置大小策略,当有布局管理器时起作用,窗口变化
//按钮垂直和水平大小都会有扩展,不会只宽度变
Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test1.setMinimumSize(160, 30); //设置按钮最小的宽度和高度为160和30,不能在小了
Test2.setMinimumSize(160, 30);
Test3.setMinimumSize(160, 30);
Test4.setMinimumSize(160, 30);
QHBoxLayout *hlayout = new QHBoxLayout(); //创建一个水平管理器的对象
hlayout->setSpacing(30); //设置这个布局管理器中的组件间间隔是30个像素
hlayout->addWidget(&Test1); //将这个按钮组件添加到vlayout这个垂直布局管理器中
hlayout->addWidget(&Test2);
hlayout->addWidget(&Test3);
hlayout->addWidget(&Test4);
hlayout->setStretchFactor(&Test1, 1); //设置这个hlayout布局管理器中的Test1这个按钮组件的比例系数变化是1
hlayout->setStretchFactor(&Test2, 2);
hlayout->setStretchFactor(&Test3, 1);
hlayout->setStretchFactor(&Test4, 2);
setLayout(hlayout); //设置布局管理器为这个
}
void Widget::qiantao_QV_QHlayout() //嵌套的布局管理器,水平和垂直的嵌套
{
Test1.setText("Test1Button");
Test2.setText("Test2Button");
Test3.setText("Test3Button");
Test4.setText("Test4Button");
Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); //设置大小策略,当有布局管理器时起作用,窗口变化
//按钮垂直和水平大小都会有扩展,不会只宽度变
Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test1.setMinimumSize(160, 30); //设置按钮最小的宽度和高度为160和30,不能在小了
Test2.setMinimumSize(160, 30);
Test3.setMinimumSize(160, 30);
Test4.setMinimumSize(160, 30);
QVBoxLayout *vlayout = new QVBoxLayout();
QHBoxLayout *hlayout1 = new QHBoxLayout();
QHBoxLayout *hlayout2 = new QHBoxLayout();
hlayout1->setSpacing(20); //设置水平布局管理器1中的组件间隔是20个像素
hlayout2->setSpacing(20); //设置水平布局管理器2中的组件间隔是20个像素
hlayout1->addWidget(&Test1);
hlayout1->addWidget(&Test2);
hlayout2->addWidget(&Test3);
hlayout2->addWidget(&Test4);
vlayout->setSpacing(20); //设置垂直布局管理器中的两个布局管理器的间隔是20个像素
vlayout->addLayout(hlayout1); //添加管理布局时,要用addLayout,不能用addWidget了
vlayout->addLayout(hlayout2);
vlayout->setStretchFactor(hlayout1, 1); //设置vlayout这个布局管理器中的hlayout1嵌套布局管理器变化时的比例系数为1
vlayout->setStretchFactor(hlayout2, 5);//设置vlayout这个布局管理器中的hlayout1嵌套布局管理器变化时的比例系数为5
setLayout(vlayout); //告诉当前的窗口,有vlayout这个布局管理器来帮忙管理
}
Widget::~Widget()
{
}
4、QGridLayout布局管理器,网格的布局管理利器
(1)以网格(二维)的方式管理界面组件
(2)QGridLayout中的比例系数设置(是针对行和列的比例系数)
--void setColumnStretch(int column, int stretch) //设置哪一列的比例系数。第一个参数就是布局管理器的哪一列,第二参数就是比例系数
--void setRowStretch(int row, int stretch) //设置哪一个行的比例系数,第一个参数就是布局管理器的哪一行,第二个参数就是比例系数
(3)QGridLayout布局管理器的使用方法
QGridLayout *layout = new QGridLayout();
layout->setSpacing(10); //设置组件的间隔为10像素
layout->addWidget(&Test1, 0, 0); //将Test1这个按钮,放在二维网络的0,0这个位置,也就是左上角的位置
layout->addWidget(&Test2, 0, 1); //将Test2这个按钮,放在二维网络的0,1这个位置,也就是右上角的位置
layout->addWidget(&Test3, 1, 0);
layout->addWidget(&Test4, 1, 1);
layout->setRowStretch(0, 1); //设置第0行的比例系数为1
layout->setRowStretch(1, 3); //设置第1行的比例系数为3
layout->setColumnStretch(0, 1); //设置第0列的比例系数为1
layout->setColumnStretch(1, 3); //设置第1列的比例系数为3
setLayout(layout);
(4)QGridLayout布局管理器的使用方法(跨行和跨列的使用,就是占用多行多列的使用)
QGridLayout *layout = new QGridLayout();
layout->setSpacing(10); //设置组件的间隔为10像素
layout->addWidget(&Test1, 0, 0, 2, 1); //将Test1这个按钮,放在二维网络的0,0这个位置,也就是左上角的位置,并且占两行一列的空间,这就是第四个参数和第五个参数
layout->addWidget(&Test2, 0, 1, 2, 1); //将Test2这个按钮,放在二维网络的0,1这个位置,也就是右上角的位置,并且占两行一列的
layout->addWidget(&Test3, 2, 0, 1, 2); //将Test3按钮,放在第2行0列的位置,并且占1行2列的位置空间。
layout->addWidget(&Test4, 3, 0, 1, 2); //将Test4按钮,放在第3行0列的位置,并且占用1行2列的位置空间
layout->setRowStretch(0, 1); //设置第0行的比例系数为1
layout->setRowStretch(1, 3); //设置第1行的比例系数为3
layout->setColumnStretch(0, 1); //设置第0列的比例系数为1
layout->setColumnStretch(1, 3); //设置第1列的比例系数为3
setLayout(layout);
(5)QGridLayout布局管理器也支持嵌套其他布局管理器
(6)QGridLayout布局管理器的使用方法,代码
#include "widget.h"
#include <QGridLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent), Test1(this), Test2(this), Test3(this), Test4(this)
{
// testQGridLayout1();
testQGridLayout2();
}
void Widget::testQGridLayout1()
{
Test1.setText("Test1button");
Test2.setText("Test2button");
Test3.setText("Test3button");
Test4.setText("Test4button");
//设置大小策略,当有布局管理器时起作用,窗口变化
//按钮垂直和水平大小都会有扩展,不会只宽度变
Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test1.setMinimumSize(160, 30);
Test2.setMinimumSize(160, 30);
Test3.setMinimumSize(160, 30);
Test4.setMinimumSize(160, 30);
QGridLayout *Layout = new QGridLayout();
Layout->setSpacing(10);
Layout->addWidget(&Test1, 0, 0);
Layout->addWidget(&Test2, 0, 1);
Layout->addWidget(&Test3, 1, 0);
Layout->addWidget(&Test4, 1, 1);
Layout->setRowStretch(0, 1); //设置第0行的比例系数为1
Layout->setRowStretch(1, 3); //设置第1行的比例系数为3
Layout->setColumnStretch(0, 1); //设置第0列的比例系数为1
Layout->setColumnStretch(1, 3); //设置第1列的比例系数为3
setLayout(Layout);
}
void Widget::testQGridLayout2()
{
Test1.setText("Test1button");
Test2.setText("Test2button");
Test3.setText("Test3button");
Test4.setText("Test4button");
//设置大小策略,当有布局管理器时起作用,窗口变化
//按钮垂直和水平大小都会有扩展,不会只宽度变
Test1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Test1.setMinimumSize(160, 30);
Test2.setMinimumSize(160, 30);
Test3.setMinimumSize(160, 30);
Test4.setMinimumSize(160, 30);
QGridLayout *Layout = new QGridLayout();
Layout->setSpacing(10);
Layout->addWidget(&Test1, 0, 0, 2, 1); //设置按钮1在0,0位置,占用2行1列
Layout->addWidget(&Test2, 0, 1, 2, 1); //设置按钮2在0,1位置,占用2行1列
Layout->addWidget(&Test3, 3, 0, 1, 2); //设置按钮3在3,0位置,占用1行2列
Layout->addWidget(&Test4, 4, 0, 1, 2); //设置按钮4在4,0位置,占用1行2列
Layout->setRowStretch(0, 1); //设置第0行的比例系数为1
Layout->setRowStretch(1, 3); //设置第1行的比例系数为3
Layout->setColumnStretch(0, 1); //设置第0列的比例系数为1
Layout->setColumnStretch(1, 3); //设置第1列的比例系数为3
setLayout(Layout);
}
Widget::~Widget()
{
}
小结:QGridLayout一以网格的方式对组件进行管理,QGridLayout中的组件可以根据需要跨越多个网格,QBoxLayout和QGridLayout支持比例系数的概念,比例系数决定了组件大小的相对变化
5、QFormLayout布局管理器
(1)以表单(Form)的方式管理界面组件(就是标签和组件是一起的,之间是相互对应的关系,一个标签一个组件,一个标签一个组件这样的)
(2)表单布局中的标签和组件是相互对应的关系
(3)QFormLayout的用法概要
--void addRow(QWidget *label, QWidget *field)
--void addRow(QWidget *label, QLayout *field)
--void addRow(const QString& LabelText, QWidget *field)
--void addRow(const QString& labelText, QLayout *field)
表单布局支持嵌套,其他布局管理器可以作为子布局被其管理
(4)例,QFormLayout表单布局管理器的使用
#include "widget.h"
#include <QLineEdit>
#include <QFormLayout> //包含表单形式的布局管理器,标签和组件相互对应
Widget::Widget(QWidget *parent)
: QWidget(parent, Qt::WindowCloseButtonHint) //加上后面的属性,就只有关闭的按钮在窗口上
{
QLineEdit *NameEdit = new QLineEdit(); //创建一个文本框组件
QLineEdit *Email = new QLineEdit();
QLineEdit *Address = new QLineEdit();
QFormLayout *Layout = new QFormLayout(); //创建一个表单形式管理的布局管理器对象
Layout->addRow("Name: ", NameEdit); //第一个参数就是标签,第二个参数就是组件,这两者是相互对应的关系,在窗口变化时,两者的距离不会改变
Layout->addRow("Email: ", Email);
Layout->addRow("Address", Address);
this->setLayout(Layout);
this->setWindowTitle("FTP"); //设置主窗口的标题
}
Widget::~Widget()
{
}
(5)QFormLayout的样式函数
--void setRowWrapPolicy(RowWrapPolicy policy) //这个函数用来设置每一行的排布方式
--void setLabelAlignment(Qt::Alignment alignment) //这个函数是用设置标签是如何对齐的,左对齐还是右对齐
@1:Layout->setRowWrapPolicy(QFormLayout::WrapAllRows); //WrapAllRows这个常量,这样的就会使得,将来显示出来的标签在上面,组件在下面,这是嵌入式中最常用的样式
@2:Layout->setLabelAlignment(Qt::AlignRight); //这样就会使得,将来显示的标签是向右对齐的
(6)QFormLayout这个表单形式的布局管理器也具备支持嵌套布局管理器的能力
小结:QFormLayout以表单的方式管理界面组件的,它的样式简洁明了,支持布局管理器的相互嵌套,是嵌入式产品中最常用的布局方式
例:QFormLayout的样式函数使用方法
#include "widget.h"
#include <QLineEdit>
#include <QFormLayout> //包含表单形式的布局管理器,标签和组件相互对应
Widget::Widget(QWidget *parent)
: QWidget(parent, Qt::WindowCloseButtonHint) //加上后面的属性,就只有关闭的按钮在窗口上
{
QLineEdit *NameEdit = new QLineEdit(); //创建一个文本框组件
QLineEdit *Email = new QLineEdit();
QLineEdit *Address = new QLineEdit();
QFormLayout *Layout = new QFormLayout(); //创建一个表单形式管理的布局管理器对象
Layout->addRow("Name: ", NameEdit); //第一个参数就是标签,第二个参数就是组件,这两者是相互对应的关系,在窗口变化时,两者的距离不会改变
Layout->addRow("Email: ", Email);
Layout->addRow("Address", Address);
Layout->setRowWrapPolicy(QFormLayout::WrapAllRows); //设置表单布局的样式,这个常量,表示设置为上面是标签下面是组件的形式
// Layout->setRowWrapPolicy(QFormLayout::WrapLongRows); //设置为如果标签不管多长都能显示出来,屏幕如果不够,会将组件弄到下面
//Layout->setLabelAlignment(Qt::AlignRight); //设置标签为向右对齐
this->setLayout(Layout);
this->setWindowTitle("FTP"); //设置主窗口的标题
}
Widget::~Widget()
{
}
6、最特别的布局管理器
(1)栈式布局管理器(QStackedLayout),就是所有组件是垂直于屏幕的,以栈的形式堆叠在一起的,我们的视线只能看到在栈顶的组件,并且只能看到一个组件。
--所有组件在垂直于屏幕的方向上被管理
--每次只有一个组件会显示在屏幕上
--只有最顶层的组件会被最终显示
(2)栈式布局管理器的特点
--组件大小一致且充满父组件的显示区
--不能直接嵌套其他布局管理器(成员函数只接受管理组件,但可以通过间接的方式管理其他布局管理器,也就是嵌套)
--能够自由切换需要显示的组件
--每次能且仅能显示一个组件
(3)QStackedLayout栈式布局管理器的用法概要
--int addWidget(QWidget *widget) //向这个栈式布局管理器中,加入它要管理的组件,每次加入一个组件的时候,这些组件都会有一个下标
--QWidget* currentWidget() //得到当前显示在屏幕上的组件是哪一个(也就是返回当前栈式布局管理器中最顶层的那一个组件)
--void setCurrentIndex(int index) //设置哪个下标的组件为当前的顶层组件,也就是要显示的组件。在每一个组件添加到这个栈式布局管理器中的时候,都会有一个下标(从0开始)
--int currentIndex() //得到当前组件的下标
例:栈式布局管理器的使用
#include "widget.h"
#include <QStackedLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent), TestButton1(this), TestButton2(this), TestButton3(this), TestButton4(this)
{
QStackedLayout *slayout = new QStackedLayout(); //创建一个栈式布局管理器对象
TestButton1.setText("Button 1");
TestButton2.setText("Button 2");
TestButton3.setText("Button 3");
TestButton4.setText("Button 4");
slayout->addWidget(&TestButton1); //将button1加入到这个栈式布局管理器中 0
slayout->addWidget(&TestButton2); //1
slayout->addWidget(&TestButton3); //2
slayout->addWidget(&TestButton4); //3
slayout->setCurrentIndex(1); //设置当前显示的组件是第二个组件,0是第一个
setLayout(slayout);
}
Widget::~Widget()
{
}
例://栈式布局管理器的间接嵌套其他的布局管理器
#include "widget.h"
#include <QStackedLayout> //栈式布局管理器
#include <QHBoxLayout> //水平布局管理器
Widget::Widget(QWidget *parent)
: QWidget(parent), TestButton1(this), TestButton2(this), TestButton3(this), TestButton4(this)
{
//testQStackedLayout();
testQStacked_QH_Layout();
}
void Widget::testQStackedLayout()
{
QStackedLayout *slayout = new QStackedLayout(); //创建一个栈式布局管理器对象
TestButton1.setText("Button 1");
TestButton2.setText("Button 2");
TestButton3.setText("Button 3");
TestButton4.setText("Button 4");
slayout->addWidget(&TestButton1); //将button1加入到这个栈式布局管理器中 0
slayout->addWidget(&TestButton2); //1
slayout->addWidget(&TestButton3); //2
slayout->addWidget(&TestButton4); //3
slayout->setCurrentIndex(1); //设置当前显示的组件是第二个组件,0是第一个
setLayout(slayout);
}
//用栈式布局管理器,间接地嵌套了水平布局管理器,依赖一个中间组件widget,这个组件中有布局管理器,这个中间组件中的布局管理器管理的组件的父组件为
//这个中间组件。之后将这个中间组件加入到栈式的布局管理器中,这样就达到了栈式布局管理器间接的嵌套了其他布局管理器,因为栈式布局管理器中的成员函数
//addWidget().这个添加组件的成员函数,只接受QWidget类型的指针对象。所以只能接受组件,不能接受布局管理器
void Widget::testQStacked_QH_Layout()
{
QStackedLayout *slayout = new QStackedLayout(); //创建一个栈式布局管理器对象
QHBoxLayout *hlayout = new QHBoxLayout(); //创建一个水平布局管理器对象
QWidget *widget = new QWidget(); //创建一个组件对象
TestButton1.setText("Button 1");
TestButton2.setText("Button 2");
TestButton3.setText("Button 3");
TestButton4.setText("Button 4");
TestButton2.setParent(widget); //设置按钮2的父组件为新创建的widget对象
TestButton3.setParent(widget); //设置按钮3的父组件为新创建的widget对象
hlayout->addWidget(&TestButton2); //将按钮2添加到水平布局管理器中
hlayout->addWidget(&TestButton3); //将按钮3添加到水平布局管理器中
widget->setLayout(hlayout); //设置widget这个组件的窗口为hlayout这个布局管理器管理
slayout->addWidget(&TestButton1); //将按钮1添加到这个栈式布局管理器中 0
slayout->addWidget(widget); //将widget这个窗口组件添加到这个栈式布局管理器中,这个窗口组件中用水平管理器管理了两个按钮 1
slayout->addWidget(&TestButton4); //将按钮4添加到这个栈式布局管理器中 2
slayout->setCurrentIndex(1);
setLayout(slayout); //设置当前窗口组件是用的栈式布局管理器
}
Widget::~Widget()
{
}
(4)当时上面的栈式布局管理器,我们是用代码的方式,来指定显示在顶层的组件是哪一个,并不能达到动态的效果,所以接下来我们就要解决这个问题了
7、计时器的概念
(1)计时器是工程开发中非常重要的角色
(2)计时器用于每个一定的时间触发一个消息的
(3)计时器消息最终会被转化为函数调用
(4)宏观上:计时器在每个时间间隔会调用指定的函数
8、Qt中的计时器(QTimer)在QtCore这个头文件中
(1)计时器(QTimer)的使用方法
@1:编写计时器消息处理函数
@2:在程序中创建计时器对象
@3:连接计时器消息和消息处理函数(信号和槽,信号就是计时器的消息,槽就是消息处理函数。用connect函数连接)
@4:设置计时器时间间隔并启动计时
(2)在类中声明这个槽(消息处理函数),将来用来计时器时间到了的时候发消息所触发的消息处理函数。创建QTimer这个计时器对象,在QtCore这个头文件中。用connect函数进行信号消息和槽
消息处理函数连接,发消息的对象是刚创建的QTimer的对象,信号是timerout()信号,this,槽就是刚才编写的消息处理函数。最后启动计时器,调用start成员函数启动(start(2000),2S发
计时器时间到发一次消息)
(3)例:计时器的使用
//类中要声明槽函数
private slots: //声明槽函数
void timetimerout();
//计时器的使用测试
void Widget::testtimer()
{
QTimer *timer = new QTimer(); //创建一个计时器对象
connect(timer, SIGNAL(timeout()), this, SLOT(timetimerout())); //timeout()为计时器的信号
timer->start(2000); //启动计时,并设置2S计时时间到
}
//计时器的消息处理函数
void Widget::timetimerout()
{
qDebug() << "timetimerout";
}
(4)用计时器来完成栈式布局管理器中的组件的逐个显示,布局管理器中的coutn()成员函数可以获取当前布局管理器中管理的组件个数
void Widget::timetimerout()
{
//layout()函数会将当前组件中的布局管理器直接返回,当时返回的布局管理器类型是Layout的指针类型,所以我们要给装换成我们的布局管理器类型
QStackedLayout *slayout = dynamic_cast<QStackedLayout*>(layout());
}
(5)例:栈式布局管理器,和计时器的方式循环显示栈式布局管理器中的各个组件
#include "widget.h"
#include <QStackedLayout> //栈式布局管理器
#include <QHBoxLayout> //水平布局管理器
#include <QtCore> //使用计时器要包含这个
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent), TestButton1(this), TestButton2(this), TestButton3(this), TestButton4(this)
{
//testQStackedLayout();
//testQStacked_QH_Layout();
//testtimer();
test_Timer_QStacked_QH_Layout();
}
void Widget::testQStackedLayout()
{
QStackedLayout *slayout = new QStackedLayout(); //创建一个栈式布局管理器对象
TestButton1.setText("Button 1");
TestButton2.setText("Button 2");
TestButton3.setText("Button 3");
TestButton4.setText("Button 4");
slayout->addWidget(&TestButton1); //将button1加入到这个栈式布局管理器中 0
slayout->addWidget(&TestButton2); //1
slayout->addWidget(&TestButton3); //2
slayout->addWidget(&TestButton4); //3
slayout->setCurrentIndex(1); //设置当前显示的组件是第二个组件,0是第一个
setLayout(slayout);
}
//用栈式布局管理器,间接地嵌套了水平布局管理器,依赖一个中间组件widget,这个组件中有布局管理器,这个中间组件中的布局管理器管理的组件的父组件为
//这个中间组件。之后将这个中间组件加入到栈式的布局管理器中,这样就达到了栈式布局管理器间接的嵌套了其他布局管理器,因为栈式布局管理器中的成员函数
//addWidget().这个添加组件的成员函数,只接受QWidget类型的指针对象。所以只能接受组件,不能接受布局管理器
void Widget::testQStacked_QH_Layout()
{
QStackedLayout *slayout = new QStackedLayout(); //创建一个栈式布局管理器对象
QHBoxLayout *hlayout = new QHBoxLayout(); //创建一个水平布局管理器对象
QWidget *widget = new QWidget(); //创建一个组件对象
TestButton1.setText("Button 1");
TestButton2.setText("Button 2");
TestButton3.setText("Button 3");
TestButton4.setText("Button 4");
TestButton2.setParent(widget); //设置按钮2的父组件为新创建的widget对象
TestButton3.setParent(widget); //设置按钮3的父组件为新创建的widget对象
hlayout->addWidget(&TestButton2); //将按钮2添加到水平布局管理器中
hlayout->addWidget(&TestButton3); //将按钮3添加到水平布局管理器中
widget->setLayout(hlayout); //设置widget这个组件的窗口为hlayout这个布局管理器管理
slayout->addWidget(&TestButton1); //将按钮1添加到这个栈式布局管理器中 0
slayout->addWidget(widget); //将widget这个窗口组件添加到这个栈式布局管理器中,这个窗口组件中用水平管理器管理了两个按钮 1
slayout->addWidget(&TestButton4); //将按钮4添加到这个栈式布局管理器中 2
slayout->setCurrentIndex(1);
setLayout(slayout); //设置当前窗口组件是用的栈式布局管理器
}
//计时器的方法,每隔2S来逐个显示栈式布局管理器中的组件
void Widget::test_Timer_QStacked_QH_Layout()
{
QStackedLayout *slayout = new QStackedLayout(); //创建一个栈式布局管理器对象
QHBoxLayout *hlayout = new QHBoxLayout(); //创建一个水平布局管理器对象
QWidget *widget = new QWidget(); //创建一个组件对象
QTimer *timer = new QTimer(); //创建一个计时器对象
TestButton1.setText("Button 1");
TestButton2.setText("Button 2");
TestButton3.setText("Button 3");
TestButton4.setText("Button 4");
TestButton2.setParent(widget); //设置按钮2的父组件为新创建的widget对象
TestButton3.setParent(widget); //设置按钮3的父组件为新创建的widget对象
hlayout->addWidget(&TestButton2); //将按钮2添加到水平布局管理器中
hlayout->addWidget(&TestButton3); //将按钮3添加到水平布局管理器中
widget->setLayout(hlayout); //设置widget这个组件的窗口为hlayout这个布局管理器管理
slayout->addWidget(&TestButton1); //将按钮1添加到这个栈式布局管理器中 0
slayout->addWidget(widget); //将widget这个窗口组件添加到这个栈式布局管理器中,这个窗口组件中用水平管理器管理了两个按钮 1
slayout->addWidget(&TestButton4); //将按钮4添加到这个栈式布局管理器中 2
slayout->setCurrentIndex(1);
setLayout(slayout); //设置当前窗口组件是用的栈式布局管理器
connect(timer, SIGNAL(timeout()), this, SLOT(timetimerout())); //连接计时器的信号与槽
timer->start(2000); //启动计时器,并每个2S发一次消息
}
//计时器的使用测试
void Widget::testtimer()
{
QTimer *timer = new QTimer(); //创建一个计时器对象
connect(timer, SIGNAL(timeout()), this, SLOT(timetimerout())); //timeout()为计时器的信号
timer->start(2000); //启动计时,并设置2S计时时间到
}
/*
//计时器的消息处理函数
void Widget::timetimerout()
{
qDebug() << "timetimerout";
}
*/
//计时器的消息处理函数
void Widget::timetimerout()
{
//进到计时器的消息处理函数中,因为要循环的显示栈式布局管理器中的组件,所以要先获取这个栈式布局管理,以达到操作这个栈式布局管理器
//layout()函数会将当前组件中的布局管理器直接返回,但是返回的布局管理器类型是Layout的指针类型,所以我们要给装换成我们的布局管理器类型
QStackedLayout *slayout = dynamic_cast<QStackedLayout*>(layout());
if ( NULL != slayout )
{
//这时证明我们已经得到了栈式布局管理器
//我们要取得布局管理器中的下一个顶层组件的下标
int index = ((slayout->currentIndex() + 1) % slayout->count()); //前面获得当前的顶层组件下标,+1后为下一个要显示的组件下标
//count是获取当前栈式布局管理器中的组件个数
//取余是为了防止+1导致的溢出,可以让其一直循环
slayout->setCurrentIndex(index); //设置当前要显示的组件下标
}
}
Widget::~Widget()
{
}
本文出自 “whylinux” 博客,谢绝转载!
以上是关于XP下资源管理器无法正常记忆窗口大小和位置,求解。的主要内容,如果未能解决你的问题,请参考以下文章