窗口是什么?
窗口部件(Widget)简称部件,是Qt中建立用户界面的主要元素。像主窗口,对话框﹑标签、还有以后要介绍到的按钮,文本输人框等都是窗口部件。这些部件可以接收用户输入,显示数据和状态信息,并且在屏幕上绘制自己。有些也可以作为一个容器来放置其他部件。Qt中把没有嵌入到其他部件中的部件称为窗口,一般窗口都有边框和标题栏,就像程序中的 widget和 label一样。QMain Window和大量的QDialog子类是最一般的窗口类型。窗口就是没有父部件的部件,所以又称为顶级部件( top-level wid-get)。与其相对的是非窗口部件,又称为子部件(child widget)。在Qt中大部分部件被用作子部件,嵌入在别的窗口中,如程序中的 label2。这部分内容可以查看关键字Qt Widgets和 Window and Dialog Widgets。
示例程序:
QApplication a(argc, argv);
// 新建QWidget类对象,默认parent参数是0,所以它是个窗口
QWidget *widget = new QWidget(0, Qt::Dialog | Qt::FramelessWindowHint);
// 设置窗口标题
widget->setWindowTitle(QObject::tr("我是widget"));
// 新建QLabel对象,默认parent参数是0,所以它是个窗口
QLabel *label = new QLabel(0, Qt::SplashScreen | Qt::WindowStaysOnTopHint);
label->setWindowTitle(QObject::tr("我是label"));
// 设置要显示的信息
label->setText(QObject::tr("label:我是个窗口"));
// 改变部件大小,以便能显示出完整的内容
label->resize(180, 20);
// label2指定了父窗口为widget,所以不是窗口
QLabel *label2 = new QLabel(widget);
label2->setText(QObject::tr("label2:我不是独立窗口,只是widget的子部件"));
label2->resize(250, 20);
// 在屏幕上显示出来
label->show();
widget->show();
int ret = a.exec();
delete label;
delete widget;
return ret;
窗口类型
前面讲到窗口一般都有边框和标题栏,其实这也不是必需的。QWidget的构造函数有两个参数:QWidget * parent = 0和Qt : : WindowFlags f = 0,前面的 parent 指父窗口部件,默认值为o,表明没有父窗口;而后面的f参数是Qt : : WindowFlags类型的,是Qt:: WindowType枚举类型值的或组合。Qt : : WindowType枚举类型用来为部件指定各种窗口系统属性,比如f=0表明窗口类型的值为Qt :: Widget,这是QWidget的默认类型,这种类型的部件如果有父窗口,那么它就是子部件,否则就是独立窗口。Qt : : WindowType包括了很多类型,下面演示其中的Qt:; Dialog 和Qt : : Splash-Screen,更改程序中新建对象的那两行代码:
Qwidget* widget=new QWidget(0,Qt::Dialog);
QLabel* Label=new QLabel(0,Qt::SplashScreen)
窗口的几何布局
对于一个窗口,往往要设置它的大小和运行时出现的位置,这就是要说的窗口几何布局。在前面的例子中已经看到了, widget默认的大小就是它所包含的子部件label2的大小,而 widget和 label出现时在窗口上的位置也是不确定的。对于窗口的大小和位置,根据是否包含边框和标题栏两种情况,要用不同的函数来获取。可以在帮助索引中查看 Window and Dialog Widgets关键字,文档中显示了窗口的几何布局图(qtcreator)
包含框架:x(),y( ) , frameGeometry().pos()和 move()等函数;
不包含框架:geometry( ) , width(), height() ,rect()和 size()等函数。
QApplication a(argc, argv);
QWidget widget;
widget.resize(400, 300); // 设置窗口大小
widget.move(200, 100); // 设置窗口位置
widget.show();
int x = widget.x();
qDebug("x: %d", x); // 输出x的值
int y = widget.y();
qDebug("y: %d", y);
QRect geometry = widget.geometry();
QRect frame = widget.frameGeometry();
qDebug() << "geometry: " << geometry << "frame: " << frame;
return a.exec();
开始调试程序之前可以先看一下这些函数的介绍。首先将光标定位到函数上,然后按下Fl键,打开函数的帮助文档。可以看到,x()、y()分别返回部件在其父部件中位置坐标的x,y值,它们的默认值为0。而 geometry()和 frameGeometry()函数分别返回没有边框和包含边框的窗口框架矩形的值,其返回值是QRect类型的,就是一个矩形,它的形式是(位置坐标,大小信息),也就是(x,y,宽,高)。
结果:
x: 200
y: 100
geometry: QRect(208,131 400×300)
frame: QRect(200,100 416×339)//有边框
注意:qDebug:是基于<QDubug>头文件
也有:在终端现实
对话框
QDialog类是所有对话框窗口类的基类。对话框窗口是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口。按照运行对话框时是否还可以和该程序的其也窗口进行交互,对话框常被分为两类:模态的(modal)和非模态的( modeless)
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDialog>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QDialog dialog(this);
dialog.show();
}
MyWidget::~MyWidget()
{
delete ui;
}
在 MyWidget类的构造函数中定义了一个QDialog类对象,还指定了dialog 的父窗口为MyWidget类对象(即this参数的作用),最后调用show()函数让其显示。运行程序时就发现,一个窗口一闪而过,然后就只显示MyWidget窗口了,为什么会这样呢?因为对于一个函数中定义的变量,等这个函数执行结束后,它就会自动释放。也就是说,这里的dialog对象只在这个构造函数中有用,等这个构造函数执行完了,dialog 也就消失了。为了不让 dialog消失,可以将QDialog 对象的创建代码更改如下:
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDialog>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QDialog *dialog = new QDialog(this);
dialog->show();
}
MyWidget::~MyWidget()
{
delete ui;
}
再次修改
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QDialog dialog(this);
dialog.exec();
}
这时运行程序就会发现对话框弹出来了,但是 MyWidget窗口并没有出来,当关闭对话框后,MyWidget窗口才弹出来。这个对话框与前面那个对话框的效果不同,称它为模态对话框,而前面那种对话框称为非模态对话框。
模态对话框就是在没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互,比如新建项目时弹出的对话框。而对于非模态对话框,既可以与它交互,也可以与同一程序中的其他窗口交互,如 Microsoft Word 中的查找替换对话框。就像前面看到的,要想使一个对话框成为模态对话框,则只需要调用它的exec()函数;而要使其成为非模态对话框,则可以使用new操作来创建,然后使用show()函数来显示。其实使用show()函数也可以建立模态对话框,只须在其前面使用setModal()函数即可。例如:
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDialog>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QDialog *dialog = new QDialog(this);
dialog->setModal(true);
dialog->show();
}
MyWidget::~MyWidget()
{
delete ui;
}
信号槽
Qt中使用信号和槽机制来完成对象之间的协同操作。简单来说,信号和槽都是函数﹐比如单击窗口上的一个按钮后想要弹出一个对话框,那么可以将这个按钮的单击信号和自定义的槽关联起来,在这个槽中创建一个对话框并且显示它。这样,单击这个按钮时就会发射信号
以后再深入探究(应该是借鉴啦Linux的信号机制)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/129662.html