- 1. Qt的介绍
- 2. Qt的框架
- 3. 项目文件(.pro)
- 4. 第一个qt程序
- 5. 父窗口和子窗口的区别 (控件,部件,构件)
- 6. 信号和槽
- 两个界面之间的联动
- 7. 坐标系统
- 8. 内存回收机制 new delete
- 9. 带菜单栏的窗口
- 10. 对话框
- 模态对话框
- 非模态对话框
- 标准对话框
- 文件对话框
- 小tip
- 帮助文档跳转问题
光标 放在对应的类中,然后 fn + f1 就会跳到帮助文档 用头文件之前,必须保证.pro 包含相应的模块 
qmake 和 cmake好像
qt5 基本模块
- 创建新项目
- 其他项目 — 空qmake project
- 编写 pro文件
- 添加新文件
- 基本结构
#includeint main(int argc, char **argv) { QApplication app(argc, argv); app.exec(); return 0; }
- 加入界面
#include5. 父窗口和子窗口的区别 (控件,部件,构件)#include // 窗口控件基类 int main(int argc, char **argv) { QApplication app(argc, argv); QWidget w; w.setWindowTitle("hello qt"); // 设置标题 w.show(); app.exec(); return 0; }
下面这段代码 不指定父对象的运行结果
#include#include // 窗口控件基类 #include int main(int argc, char **argv) { QApplication app(argc, argv); QWidget w; w.setWindowTitle("hello qt"); QPushButton b; b.setText("hhh"); // 给按钮赋值 // b.setParent(&w); b.show(); w.show(); app.exec(); return 0; }
是两个单独的控件
如果指定父对象后,结果如下。
自定义槽函数
void mySignal();
public slots:
void changeWin();
private:
QPushButton b1;
};
#include "subwidget.h"
subWidget::subWidget(QWidget *parent) : QWidget(parent)
{
b1.setParent(this);
b1.setText("跳转到大窗口");
resize(400, 300);
connect(&b1, &QPushButton::pressed, this, &subWidget::changeWin);
}
void subWidget::changeWin()
{
emit mySignal();
}
而在主界面中,设置对子界面这种信号的处理槽函数。达到通信效果。
// 处理子窗口的信号
connect(&sw, &subWidget::mySignal, this, &Widget::dealSub);
至此,我们实现了两个窗口之间的联动。7. 坐标系统
对于父窗口(主窗口),坐标系统相对于屏幕
原点:相对于屏幕左上角
x:往右递增
y:往下递增
子窗口,坐标系统相对于父窗口
原点:相对于窗口空白区域左上角(不包括边框)
x:往右递增
y:往下递增
前提: 1)指定父对象后 2)直接或间接继承与QObject
指定父对象后,子对象如果是动态分配空间的new,不需要手动释放delete
系统会自动释放。
带菜单栏的窗口,需要继承基类 QMainWindow
首先需要一个 菜单栏
// 菜单栏
QMenuBar *mBar = menuBar();
然后需要添加菜单
// 添加菜单
QMenu *pFile = mBar->addMenu("文件");
QMenu *pFile2 = mBar->addMenu("图片");
这就是菜单
菜单需要菜单项,也就是上图中的 new和 open这些选项。菜单项可以添加功能,通过信号和槽的方式来添加。
// 添加菜单项, 添加动作
QAction *pNew = pFile->addAction("new");
connect(pNew, &QAction::triggered,
[=] ()
{
qDebug() << "新建被按下";
}
);
pFile->addSeparator(); // 添加分割线
QAction *pOpen = pFile->addAction("open");
除了菜单栏以外,还可以添加工具栏(菜单栏的快捷方式)
// 工具栏 菜单项的快捷方式
QToolBar *toolBar = addToolBar("toolBar");
// 工具栏 添加快捷键
toolBar->addAction(pNew);
toolBar->addAction(pOpen);
除了添加菜单栏的东西,还可以添加控件
// 添加小控件,这里添加一个按钮
QPushButton *b = new QPushButton(this);
b->setText("^_^");
toolBar->addWidget(b);
connect(b, &QPushButton::clicked,
[=]()
{
b->setText("123");
}
);
还有一个部分是状态栏,也就是最下边的部分
// 状态栏
QStatusBar *sBar = statusBar();
QLabel *label = new QLabel(this);
label->setText("Normal text file");
sBar->addWidget(label);
// addWidget 从左往右添加
sBar->addWidget(new QLabel("second", this));
// addPermanentWidget 从右往左添加
sBar->addPermanentWidget(new QLabel("right", this));
这些都弄完的话,就是核心控件了。就是主要的功能区。这里添加一个编辑框作为示例
// 核心控件
QTextEdit *textEdit = new QTextEdit(this);
setCentralWidget(textEdit);
到目前为止,基本的功能已经都有了,接下来再加一个浮动窗口。
// 浮动窗口
QDockWidget *dock = new QDockWidget(this);
addDockWidget(Qt::LeftDockWidgetArea,dock);
QTextEdit *textEdit1 = new QTextEdit(this);
dock->setWidget(textEdit1);
10. 对话框
模态对话框
模态对话框即对话框出现后,不可以点击页面上的其他控件,只能点击当前对话框。
QAction *p1 = menu->addAction("模态对话框");
connect(p1, &QAction::triggered,
[=]()
{
QDialog dlg;
dlg.exec();
qDebug() << "11111";
}
);
非模态对话框
非模块对话框则是对话框出现后,可以点击当前对话框,也可以不点。
QAction *p2 = menu->addAction("非模态对话框");
connect(p2, &QAction::triggered,
[=]()
{
// 这样的 局部变量会一闪而过,因为出了作用域这个对象就析构了
// QDialog dlg;
// dlg.show();
// 可以作为主类的成员变量,这样就可以了
// dlg_.show();
// 或者 new一个局部变量
QDialog *p = new QDialog();
p->setAttribute(Qt::WA_DeleteOnClose);
p->show();
}
);
标准对话框
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::Yes, QMessageBox::No);
switch (ret) {
case QMessageBox::Yes:
qDebug() << "I am ok";
break;
case QMessageBox::No:
qDebug() << "I am No";
break;
}
});
文件对话框
QFileDialog 提供了文件对话框
QAction *p5 = menu->addAction("文件对话框");
connect(p5, &QAction::triggered,
[=]()
{
QString path = QFileDialog::getOpenFileName(
this,
"open",
"../",
"source(*.cpp *.h);;"
"Text(*.txt);;"
"all(*.*)"
);
qDebug() << path;
}
);
文件过滤
qt可以使用 fn + f1 跳到帮助文档
但是有时候,会发现找不到。
这里我们对这个函数找帮助文档
结果如下
这和我们的预期不符合。 这不是因为qt功能不行,而是我们用错了。
可以看到这个函数由一个参数,而我们使用帮助文档时没有写参数。
这里我们添加一个数试试。
结果如下,和预期一样。



