C++ QT学习之路----窗体应用

本篇文章中,主要记录控制窗体的操作。

本文在上一篇文章《C++ QT学习之路----创建hello world窗体》基础上添加新的代码。

先来设置窗体固定大小

在QT_practice.cpp文件中添加新的代码:

    //窗体标题
	QString str;
	str = str.fromLocal8Bit("Qt5.1 窗体应用");
	this->setWindowTitle(str);
	//窗体最大300*300
	this->setMaximumSize(300, 300);
	//窗体最小300*300
	this->setMinimumSize(300, 300);

 编译运行出来的效果如下:

C++ QT学习之路----窗体应用_第1张图片

该窗体大小固定,不可以修改。

期间,有个小插曲。我开始生成的窗体,标题中文部分“窗体应用”是一串乱码,应该是字符串编码格式没有调整过来。网上找了下,发现需要用fromLocal8Bit()将本地字符集(我理解就是中文字串)转换成QT能识别的编码格式(Unicode)。编译,运行ok。

 

设置窗体初始位置、背景色:

    //默认窗体居中显示,如果想要更改,用move或setGeometry
	this->move(100,100);
	//背景灰色
	this->setStyleSheet("background:grey");

设置窗体的icon:

    //窗体ICO图片
	this->setWindowIcon(QIcon("qt.ico"));

 设置移动无边框窗体:

头文件中先添加鼠标移动事件以及记录窗体、鼠标的坐标

protected:
	//鼠标按下
	void mousePressEvent(QMouseEvent *e);
	//鼠标移动
	void mouseMoveEvent(QMouseEvent *e);
	//鼠标释放
	void mouseReleaseEvent(QMouseEvent *e);

private:
	QPushButton *btClose;
	QPoint last;

 源文件中添加如下代码:

关闭按钮

    //窗体标题
	QString str;
	str = str.fromLocal8Bit("Qt1.0 移动无边框窗体");
	//去掉标题栏
	this->setWindowFlags(Qt::FramelessWindowHint);    
    //添加一个关闭按钮,实现关闭功能
	btClose = new QPushButton(this);
	btClose->setText("close");
	btClose->setGeometry(QRect(50, 100, 200, 25));
	//按钮点击事件
	connect(btClose, SIGNAL(clicked()), this, SLOT(close()));

 鼠标事件

void QT_practice::mousePressEvent(QMouseEvent *e)
{
	last = e->globalPos();
}

void QT_practice::mouseMoveEvent(QMouseEvent *e)
{
	int dx = e->globalX() - last.x();
	int dy = e->globalY() - last.y();

	last = e->globalPos();
	move(this->pos().x() + dx, this->pos().y() + dy);//这里(x(),y())是父窗体左上角在屏幕中的位置
}

void QT_practice::mouseReleaseEvent(QMouseEvent *e)
{
	int dx = e->globalX() - last.x();
	int dy = e->globalY() - last.y();
	move(x() + dx, y() + dy);
}

运行就可以打开一个无边框的程序了,不过,鼠标滑到button上时,移动会出现错位现象,这个问题查了好久,没搞定,先就这样放着,哈哈。

 

去掉窗体最大化、最小化按钮:

//去掉标题栏最大化、最小化按钮
	this->setWindowFlags(Qt::WindowCloseButtonHint);

调用子窗体:

欸,研究了两天,没搞出来,应该是前期环境搭建得有点问题,VS2017选择新建项目的时候,没法创建带.h/.cpp的选项,只能创建一个ui文件,后面还是在QT creator里创建了个子窗体项目,然后加载到VS2017里,真是被自己笑哭了,为啥这么折腾。。。

C++ QT学习之路----窗体应用_第2张图片

 QT creator里创建个子窗体,然后加载到原工程中,目录如下:

C++ QT学习之路----窗体应用_第3张图片

 QT_practice.h头文件中添加控件和点击事件,调用子窗体

#pragma once

#include 
#include "ui_QT_practice.h"

#include 	//鼠标类头文件
#include 	//引用按钮类头文件
#include "subwindow.h"	//引用子窗体

class QT_practice : public QMainWindow
{
    Q_OBJECT

public:
    QT_practice(QWidget *parent = Q_NULLPTR);

private:
    Ui::QT_practiceClass ui;
	QPushButton *button;
	subWindow sw;
private slots:
	void showsubWindow();
	/*
protected:
	//鼠标按下
	void mousePressEvent(QMouseEvent *e);
	//鼠标移动
	void mouseMoveEvent(QMouseEvent *e);
	//鼠标释放
	void mouseReleaseEvent(QMouseEvent *e);

private:
	QPushButton *btClose;
	QPoint last;*/
};

QT_practice.cpp文件中添加如下代码:

	//实例QPushButton控件
	button = new QPushButton(this);
	//按钮显示位置
	str = str.fromLocal8Bit("打开子窗口");
	button->setText(str);
	button->setGeometry(QRect(100, 100, 100, 25));
	//点击事件
	connect(button, SIGNAL(clicked()), this, SLOT(showsubWindow()));

 

void QT_practice::showsubWindow()
{
	//显示subWindow窗体
	sw.show();
}

不过,运行之后,打开了子窗口,关闭主窗口时,子窗口不会关闭,代码里需要在关闭主窗体事件中添加关闭子窗体,我就懒得改了。

还是得先把VS2017+QT环境搭建好,不然用起来太不方便了。

设置背景:

//设置背景透明
	this->setAttribute(Qt::WA_TranslucentBackground, true);
	this->setStyleSheet("background-image:url(:/new/prefixl/touming);background-repeat:no-repeat;");

 

你可能感兴趣的:(c++,qt)