坐标系统
#include "mywidget.h"
#include <QPushButton>
#include "mybutton.h"
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
/* 对于主窗口,坐标系统相对于屏幕
* 原点:相对于屏幕左上角
* x: 往右递增
* y: 往下递增
*/
move(100, 100);
/* 子窗口,坐标系统相对于父窗口
* 原点:相对于窗口空白区域左上角(不包括边框)
* x: 往右递增
* y: 往下递增
*/
QPushButton *b1 = new QPushButton(this);
b1->move(100, 100);
b1->setText("son");
b1->resize(200, 100);
QPushButton *b2 = new QPushButton(b1);
b2->move(10, 10);
b2->setText("sonson");
MyButton *b3 = new MyButton(this);
b3->setText("123");
//1)指定父对象后 2)直接或间接继承于QObject
//子对象如果是动态分配空间的new,不需要手动释放delete
//系统会自动释放
//QT的对象树机制
}
MyWidget::~MyWidget()
{
}
菜单栏工具栏
new project—>Application/QtWidget—>next—>next—>基类选择QMainWindow—>next
在PC端带菜单栏的窗口一般都选择QMainWindow为基类
头文件 #include<QMenuBar>
QmenBar提供了很多接口
//添加菜单栏,内部动态分配,不需要new
QMenuBar *mBar = menuBar();
//添加菜单
QMenu *pFile = mBar->addMenu("文件");
//添加菜单项,添加动作,需要头文件#include<QAction>
QAction *pNew = pFile->addAction("新建");
//pNew按下产生信号,控制台输出
connect(pNew, &QAction::triggered,
[=]()
{
qDebug() << "新建被按下";
}
);
//添加分割线·
pFile->addSeparator();
QAction *pOpen = pFile->addAction("打开");
//工具栏,菜单项的快捷方式
QToolBar *toolBar = addToolBar("toolBar");
//工具栏添加快捷键
toolBar->addAction(pNew);
//添加小控件
QPushButton *b = new QPushButton(this);
b->setText("^_^");
connect(b, &QPushButton::clicked,
[=]()
{
b->setText("123");
}
);
//状态栏,需要头文件#include<QstatusBar >,加标签需要头文件#include<QLabel>..//
//状态栏会位于窗口最底部
QStatusBar *sBar = statusBar();
QLabel *label = new QLabel(this);
label->setText("Normal text file");
sBar->addWidget(label);
//addWidget 从左往右添加,快速添加状态标签方法
sBar->addWidget(new QLabel("2", this));
// addPermanentWidget 从右往左添加
sBar->addPermanentWidget(new QLabel("3", this));
//核心控件,需要头文件#include<QTextEdit>,右键弹出copy等核心控件
QTextEdit *textEdit = new QTextEdit(this);
setCentralWidget(textEdit);
//浮动窗口,需要头文件#include<QDockWidget>,可以移动的窗口
QDockWidget *dock = new QDockWidget(this);
addDockWidget(Qt::RightDockWidgetArea, dock);
//QT小技巧:不会写函数参数时,先写一个参数然后按F1会有帮助文档信息,不写没有
//给浮动窗口添加控件
QTextEdit *textEdit1 = new QTextEdit(this);
dock->setWidget(textEdit1);
模态与非模态对话框
//需要头文件#include<QDialog>
QMenuBar *mBar = menuBar();
setMenuBar(mBar);
QMenu *menu = mBar->addMenu("对话框");
QAction *p1 = menu->addAction("模态对话框");
connect(p1, &QAction::triggered,
[=]()
{
QDialog dlg;//直接创建模态对话框
dlg.exec();//exec(),阻塞等待用户操作
qDebug() << "111111";
}
);
Action *p2 = menu->addAction("非模态对话框");
connect(p2, &QAction::triggered,
[=]()
{
// QDialog dlg;
// dlg.show();//窗口一闪而过,因为lambda表达式结束则消失
// qDebug() << "111111";
//在mainwindow.h中定义成为QDialog dlg,不会造成内存泄漏,最简单
// dlg.show();显示窗口,不会一闪而过
// qDebug()<<"2222"
//使用局部变量实现,动态分配空间,
//窗口的释放在程序结束之后,如果需要多次操作该按钮,会导致内存泄露
// QDialog *p = new QDialog(this);
// p->show();
//局部变量实现,设置关闭即释放的属性
QDialog *p = new QDialog;
p->setAttribute(Qt::WA_DeleteOnClose);
p->show();
}
);
标准对话框和文件对话框
//设置菜单项"关于对话框",点击后会弹出对话框,标题为"about",内容为"关于qt",且自带一个OK按钮
//头文件#include<QMessageBox>
QAction *p3 = menu->addAction("关于对话框");
connect(p3, &QAction::triggered,
[=]()
{
QMessageBox::about(this, "about", "关于qt");
}
);
//
QAction *p4 = menu->addAction("问题对话框");
connect(p4, &QAction::triggered,
[=]()
{
int ret = QMessageBox::question(this,
"question", "Are you ok?",
QMessageBox::Ok |
QMessageBox::Cancel);
//注意QMessageBox::Ok | QMessageBox::Cancel 这个参数是自己指定按钮,默认的话会有YES和NO两个按钮
switch(ret)
{
case QMessageBox::Ok:
qDebug() << "i am ok";
break;
case QMessageBox::Cancel:
qDebug() << "i am bad";
break;
default:
break;
}
}
);
//需要头文件#include<QFileDialog>
QAction *p5 = menu->addAction("文件对话框");
connect(p5, &QAction::triggered,
[=]()
{
QString path = QFileDialog::getOpenFileName(
this,
"open",
"../",
"souce(*.cpp *.h);;Text(*.txt);;all(*.*)"//两个分号分割,
);
qDebug() << path;
}
// "souce(*.cpp *.h);;Text(*.txt);;all(*.*)"是在弹出的文件对话框中起按格式过滤作用(会有一个下拉单选择列出的格式),
多个格式之间用";;"隔开,如果一行写不下,可以写完一种格式后回车换行,QT进行优化会自动加上双引号后续内部拼接
);