【8】Qt模态非模态方式创建对话框

效果图:

注意:

1)模态方式:打开对话框时候不可以操作其它窗口;非模态方式:打开对话框时候可以操作其它窗口

2)在堆区创建的对话框,需要有setAttribute(Qt::WA_DeleteOnClose);        //55号,在关闭的时候释放掉对象

 

代码段:

/*****************main.cpp*******************/
#include "mainwindow.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	MainWindow w;
	w.show();
	return a.exec();
}

/****************mainwindow.h******************/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtWidgets/QMainWindow>
#include "ui_mainwindow.h"

class MainWindow : public QMainWindow
{
	Q_OBJECT

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

#endif // MAINWINDOW_H

/**************mainwindow.cpp******************/
#include "mainwindow.h"
#include <QPushButton>
#include <QLabel>
#include <QDockWidget>
#include <QTextEdit>
#include <QDialog>
#include<QAction>

#pragma execution_character_set("utf-8")//防止乱码问题
MainWindow::MainWindow(QWidget *parent)
	: QMainWindow(parent)
{
	//重置窗口大小
	resize(600, 400);

	/*************菜单栏*************/
	//菜单栏创建,并添加到MainWindow
	QMenuBar * bar = new QMenuBar;
	setMenuBar(bar);										//添加菜单栏

	//在菜单栏添加菜单
	QMenu* fileMenu = bar->addMenu("文件");
	QMenu* editMenu = bar->addMenu("编辑");

	//在菜单中添加菜单项
	QAction * newAction = fileMenu->addAction("新建");
	newAction->setIcon(QIcon(":Resources/lufei.jpg"));
	//添加分割线
	fileMenu->addSeparator();
	QAction* openAction = fileMenu->addAction("打开");
	openAction->setIcon(QIcon(":Resources/zuolong.jpg"));

	/*************工具栏*************/
	//工具栏 可以有多个
	QToolBar * toolbar = new QToolBar;
	addToolBar(Qt::LeftToolBarArea,toolbar);								//在mainwindow中添加toolbar,默认放在左侧

	toolbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);	//允许移动的范围
	toolbar->setFloatable(true);											//允许浮动
	//toolbar->setMovable(false);											//设置移动(总开关)
	//将newAction放在工具栏中
	toolbar->addAction(newAction);
	toolbar->addSeparator();												//分割线调用一次只出现一条分割线
	//将openAction放在工具栏中
	toolbar->addAction(openAction);	
	toolbar->addSeparator();												//添加分割线
	//工具栏中也可以添加控件
	QPushButton * btn = new QPushButton("mainWindow");
	toolbar->addWidget(btn);
	QPushButton * btnNotMotai = new QPushButton("非模态对话框");
	toolbar->addWidget(btnNotMotai);
	QPushButton * btnMotai = new QPushButton("模态对话框");
	toolbar->addWidget(btnMotai);

	//通过lambda表达式,以匿名对象方式创建临时槽函数
	connect(btn, &QPushButton::clicked, [=]() {
		QMainWindow * window = new QMainWindow(btn);
		window->resize(400, 200);
		QToolBar * testbutton = new QToolBar(window);
		window->addToolBar(Qt::LeftToolBarArea, testbutton);
		QAction * text = testbutton->addAction("文本");
		window->setAttribute(Qt::WA_DeleteOnClose);			//防止内存泄漏
		window->show();
	});

	//非模态方式创建对话框,打开对话框时候可以操作其它窗口
	//注意:此时只有在btnMotai按钮释放时候,dialog对象才会被释放。如果长此以往,可能会发生内存泄漏
	//需要设置一个Qt::WA_DeleteOnClose属性
	connect(btnNotMotai, &QPushButton::clicked, [=]() {
		QDialog * dialog = new QDialog(btnNotMotai);		//创建的对象要放堆上
		dialog->resize(200, 100);
		dialog->setAttribute(Qt::WA_DeleteOnClose);		//55号,在关闭的时候释放掉对象
		dialog->show();
	});

	//模态方式创建对话框,打开对话框时候不可以操作其它窗口
	connect(btnMotai, &QPushButton::clicked, [=]() {
		QDialog * dialog = new QDialog(btnMotai);		//创建的对象要放堆上
		dialog->resize(200, 100);
		dialog->setAttribute(Qt::WA_DeleteOnClose);		//55号,在关闭的时候释放掉对象
		dialog->exec();									//设置模态属性
	});

	/***********状态栏***************/
	QStatusBar * stBar = new QStatusBar;
	setStatusBar(stBar);													//状态栏默认就在最下面
	QLabel * labelSt1 = new QLabel("默认左侧状态信息",stBar);
	stBar->addWidget(labelSt1);												//放左侧信息
	QLabel * labelSt2 = new QLabel("设置右侧状态信息",stBar);				//放右侧信息
	stBar->addPermanentWidget(labelSt2);

	/************铆接部件(浮动窗口)*/
	QDockWidget * dockWidget = new QDockWidget("浮动窗口");
	addDockWidget(Qt::BottomDockWidgetArea, dockWidget);					//相对于核心部件而言的位置区域

	/************核心部件************/
	QTextEdit *textEdit = new QTextEdit;
	setCentralWidget(textEdit);												//设置核心部件

}

MainWindow::~MainWindow()
{

}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值