从零开始学习Qt(二)

一、QMainWindow

QMainWindow是一个为用户提供主窗口程序的类
添加菜单栏

	//菜单栏只能最多有一个
    // 菜单栏创建
    QMenuBar * bar =  menuBar();
    //将菜单栏放入到窗口中
    setMenuBar(bar);
    //创建菜单
    QMenu * fileMenu = bar->addMenu("文件");
    QMenu * editMenu = bar->addMenu("编辑");
    //创建菜单项
    fileMenu->addAction("新建");
    //添加分割线
    fileMenu->addSeparator();
    fileMenu->addAction("打开");

添加工具栏

	//工具栏 可以有多个
    QToolBar * toolBar = new QToolBar(this);
    addToolBar(Qt::LeftToolBarArea,  toolBar);
    //后期设置 只允许左右停靠
    toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
    //设置浮动
    toolBar->setFloatable(false);
    //设置移动(总开关)
    toolBar->setMovable(false);
    //工具栏中可以设置内容
    toolBar->addAction(newAction);
    //添加分割线
    toolBar->addSeparator();
    toolBar->addAction(openAction);
    //工具栏中添加控件(按钮)
    QPushButton * btn = new QPushButton("按钮", this);
    toolBar->addWidget(btn);

添加状态栏

    //状态栏 最多有一个
    QStatusBar * stBar = statusBar();
    //设置到窗口中
    setStatusBar(stBar);
    //放标签控件
    QLabel * label = new QLabel("提示信息", this);
    stBar->addWidget(label);
    QLabel * label2 = new QLabel("右侧提示信息", this);
    stBar->addPermanentWidget(label2);
    //铆接部件(浮动窗口)可以有多个
    QDockWidget * dockWidget = new QDockWidget("浮动", this);
    addDockWidget(Qt::BottomDockWidgetArea, dockWidget);
    //设置后期停靠区域,只允许上下
    dockWidget->setAllowedAreas(Qt::BottomDockWidgetArea|Qt::TopDockWidgetArea);
    //设置中心部件 只能一个
    QTextEdit * edit = new QTextEdit(this);
    setCentralWidget(edit);

添加头文件

#include<QMenuBar>
#include<QToolBar>
#include<QPushButton>
#include<QStatusBar>
#include<QLabel>
#include<QDockWidget>
#include<QTextEdit>

二、如何添加资源文件

  1. 在.cpp所在路径放入资源文件
  2. 工程创建新文件Qt Resource File
  3. 在.qrc文件中添加前缀(prefix)添加文件,选中路径下的资源文件
  4. 成功添加资源文件
	//使用添加Qt资源 ":+前缀名+文件名"
    ui->actionnew->setIcon(QIcon(":/img.png"));

三、创建对话框

	//点击新建按钮,弹出一个对话框
    connect(ui->actionnew, &QAction::triggered, this, [=](){
        //对话框 分类
        //模态对话框(不可以) 非模态对话框(可以对其他窗口进行操作)
//        //模态创建 阻塞
//        QDialog dlg(this);
//        dlg.resize(200, 100);
//        dlg.exec();
        //非模态对话框
        QDialog * dlg2 = new QDialog(this);
        dlg2->resize(200, 200);
        dlg2->show();
        dlg2->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候释放掉
    });
		//消息对话框
        //1.错误对话框
        QMessageBox::critical(this, "critical", "错误");
        //2.信息对话框
        QMessageBox::information(this, "information", "信息");
        //3.提示对话框
        //参数1父亲,参数2标题,参数3提示内容,参数4按键类型,参数5默认关联回车按键
        if(QMessageBox::Save == QMessageBox::question(this, "question", "问题", QMessageBox::Save|QMessageBox::Cancel, QMessageBox::Save)){
            qDebug() << "按的是保存";
        }
        else{
            qDebug() << "按的是取消";
        }
        //4.警告对话框
        QMessageBox::warning(this, "warning", "警告");
		//颜色对话框
        QColor color =  QColorDialog::getColor(QColor(255, 0, 0));
        qDebug() << "r = "<<color.red();
        //文件对话框
        //参数1父亲,参数2标题,参数3默认路径,参数4过滤文件格式
        QFileDialog::getOpenFileName(this, "打开文件", "C:\\Users\\r\\Desktop", "(*.txt)");
        qDebug() << str;//文件路径
        //字体对话框
        bool flag;
        QFont font = QFontDialog::getFont(&flag, QFont("华文彩云", 36), this);
        qDebug() << "字体:" << font.family() << "字号:" << font.pointSize() << "是否加粗" << font.bold() << "是否倾斜" << font.italic();

四、界面布局

  1. 点击.ui打开设计界面
  2. 拖拽插件,用Widget容器框住插件,点击上面按钮实现水平/垂直布局
  3. 添加水平/垂直Spacer,让布局更美观(可以调整sizeType为伸缩或固定)

五、控件

ListWidget

QStringList list;
list << "123" << "456" << "789";
ui->listWidget->addItems(list);

TreeWidget

//设置水平头
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介绍");
QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList()<<"力量");
QTreeWidgetItem * minItem = new QTreeWidget(QStringList()<<"敏捷");
QTreeWidgetItem * zhiItem = new QTreeWidget(QStringList()<<"智力");
//加载顶层的节点
ui->treeWidget->addTopLevelItem(liItem);
ui->treeWidget->addTopLevelItem(minItem);
ui->treeWidget->addTopLevelItem(zhiItem);
//追加子节点
QStringList hero1;
hero1<<"雄鹰"<<"很厉害";
QTreeWidgetItem * l1 = new QTreeWidgetItem(hero1);
liItem->addChild(l1);

TableWidget

//设置列数
ui->tableWidget->setColumnCount(3);
//设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
//设置行数
ui->tableWidget->setRowCount(5);
//设置正文
ui->tableWidget->setItem(0, 0, new QTabelWidgetItem("亚瑟"));

StackedWidget

//scrollArea按钮
connect(ui->btn_scrollArea, &QPushButton::clicked, [=](){
	ui->stackedWidget->setCurrentIndex(1);
});

六、自定义控件

  1. 项目创建新文件->Qt设计师界面类
  2. 在新创建类的ui界面中组装控件在widget控件中
  3. 在最初的ui界面中使用widget控件->提升为新创建类(控件的基类和新类的父类要相同)
    //QSpinBox移动 QSlider跟着移动
    void(QSpinBox:: * spSignal)(int)= &QSpinBox::valueChanged;
    connect(ui->spinBox, spSignal, ui->horizontalSlider, &QSlider::setValue);
    //QSlider移动 QSpinBox跟着移动
    connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox, &QSpinBox::setValue);

七、Qt中的鼠标事件

	//输出语句
	//QMouseEvent *ev
	QString str = QString("鼠标按下x=%1 y=%2",arg(ev->x()).arg(ev->y()));
	qDebug()<<str;
	//设置鼠标追踪状态(构造函数)
	setMouseTracking(true);

八、定时器

	void timerEvent(QtimerEvent *ev)
	启动定时器startTimer(1000)毫秒单位
	timerEvent的返回值是定时器的唯一标识,可以和ev->timerId作比较
//第二种定时器
	#include<QTimer>
	QTimer * timer = new QTimer(this);
	timer->start(500);
	connect(timer, &QTimer::timeout, [=](){
		static int num = 1;
		ui->label->setText(QString::number(num++));
	});

九、事件分发器

//通过event事件分发器 拦截 鼠标按下事件
	bool event(QEvent *e)
	{
		if(e->type() == QEvent::MouseButtonPress)
		{
			QMouseEvent * ev = static_cast<MouseEvent *>(e);//强制类型转换
			QString str = QString("");
			qDebug() << str;
			return true;//true表示用户自己处理这个事件,不向下分发
		}	
		//其他事件 交给父类处理 默认处理
		return QLabel::event(e);
	}

十、时间过滤器

通过事件过滤器,可以在程序分发到event事件之前再做一次高级拦截
使用 两个步骤:
1.给控件安装事件过滤器
2.重写eventfilter事件

	//步骤1 安装事件过滤器
	ui->label->installEventFiler(this);
	//步骤二 重写EventFilter事件
	bool eventFilter(QObject * obj, QEvent * e)
	{
		if(obj == ui->label)
		{
			if(e->type() == QEvent::MouseButtonPress){}
		}
		//其他默认处理
		return eventFiler(obj, e);
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值