在项目Application中:
QT Widgets Application(桌面QT应用)
QT Console Application(控制台QT应用)
QT for Python-Empty / Window(用Python开发QT应用)
QT Quick Application-Empty / Scroll / Stack /Swipe(移动平台开发QT应用)
一.QWidget
Widget 窗口主要是在上面放置布局和控件,可以嵌入到主窗体中
QWidget widget;
widget.setWindowTitle(QObject::tr("k5"));
widget.resize(400, 300);
widget.move(200, 100);
widget.show();
int x = widget.x();
qDebug("x:%d", x);
int y = widget.y();
qDebug("y:%d", y);
1.窗体框架
// widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
// widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
// main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{ //主应用程序对象,只能有一个
QApplication a(argc, argv); //继承父类QWidget
Widget w; //窗口对象默认不显示,必须调用show()方法显示窗口
w.show();
//进行消息循环,后面代码没用
return a.exec();
}
2.配置
//QTTest.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4) : QT += widgets
CONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
SOURCE += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
TRANSLATIONS += \
QTTest_zh_CN.ts
qnx : target.path = /tmp/&&{TARGET}/bin
else : unix :! android : target.path = /opt/$${TARGET}/bin
!isEmpth(target.path) : INSTALLS += target
//mainwindow.ui
<?xml version = "1.0" encoding = "UTF-8"?>
<ui version = "4.0">
<class> MainWindow </class>
<widget class = "QMainWindow" name = "MainWindow">
<property name = "geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name = "windowTitle">
<string>Maindow</string>
</property>
<widget class = "QWidget" name = "centralwidget"/>
<widget class = "QMenuBar" name = "menubar">
<property name = "geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>26</height>
</rect>
</property>
</widget>
<widget class = "QStatusBar" name = "statusbar" />
</widget>
<resources/>
<connections/>
</ui>
3.成员函数
QWidget 类继承于 QObject 类和 QPaintDevice 类
void QWidget::resize(int w, int h)
void QWidget::resize(const QSize& )
QSize QWidget::size() const
void QWidget::show()
QWidget::x()
QWidget::y()
QWidget::pos()
QWidget::find()
QWidget::font()
QWidget::grab()
QWidget::hide()
QWidget::mask()
QWidget::move()
QWidget::rect()
QWidget::close()
QWidget::lower()
QWidget::mapTo()
QWidget::raise()
QWidget::style()
QWidget::winId()
QWidget::cursor()
QWidget::layout()
QWidget::locale()
QWidget::render()
QWidget::scroll()
QWidget::update()
QWidget::window()
QWidget::actions()
QWidget::childAt()
QWidget::isModal()
QWidget::mapFrom()
QWidget::palette()
QWidget::repaint()
QWidget::setFont()
QWidget::setMask()
QWidget::toolTip()
QWidget::baseSize()
QWidget::fontInfo()
QWidget::geometry()
QWidget::hasFocus()
QWidget::isHidden()
QWidget::isWindow()
QWidget::setFocus()
QWidget::setStyle()
QWidget::sizeHint()
QWidget::addAction()
QWidget::clearMask()
QWidget::framwSize()
QWidget::grabMouse()
QWidget::isEnabled()
QWidget::isVisible()
QWidget::setCursor()
QWidget::setHidden()
QWidget::setLayout()
QWidget::setLocale()
QWidget::statusTip()
QWidget::whatsThis()
QWidget::addActions()
QWidget::adjustSize()
QWidget::clearFocus()
QWidget::focusProxy()
QWidget::isTopLevel()
QWidget::setEnabled()
QWidget::setPalette()
QWidget::setToolTip()
QWidget::setVisible()
QWidget::showNormal()
QWidget::sizePolicy()
QWidget::stackUnder()
QWidget::styleSheet()
QWidget::underMouse()
二.QDialog
1.窗体框架
QDialog类继承与QWidget类
注意:添加hellodialog.ui文件的时候,要把里面的 <class>HelloDialog</class>
<widget class = "QDialog" name = "HelloDialog"> 改过来,不然会无法识别 ui 这个指针
// hellodialog.h
#ifndef HELLODIALOG_H
#define HELLODIALOG_H
#include <QDialog>
namespace Ui{
class HelloDialog;
}
class HelloDialog : public QDialog{
Q_OBJECT
public:
explicit HelloDialog(QWidget* parent = nullptr);
~HelloDialog();
private:
Ui::HelloDialog* ui;
};
#endif // HELLODIALOG_H
// hellodialog.cpp#include "hellodialog.h"
#include "ui_hellodialog.h"
HelloDialog::HelloDialog(QWidget* parent) :
QDialog(parent),
ui(new Ui::HelloDialog)
{
ui->setupUi(this);
}
HelloDialog::~HelloDialog()
{
delete ui;
}
// main.cpp
#include "hellodialog.h"
#include <QApplication>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
HelloDialog w;
w.show();
return a.exec();
}
2.附加窗口
//模态对话框
QDialog* dialog = new QDialog(this);
dialog->setModal(true);
dialog->show();QDialog dialog;dialog.setModal(true);dialog.show()
//非模态对话框
QDialog* dialog = new QDialog(this);
dialog->show();
QDialog dialog;
dialog.show()
3.对话框状态
QDialog dialog;
if (dialog.exec() == QDialog::Accepted)
QDialog类是所有对话框窗口类,对话框窗口是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口
对话框分为模态对话框和非模态对话框
模态对话框在关闭它之前,不能与同一个应用程序的其他窗口进行交互
非模态对话框既可以和它交互,也可以和同一个应用程序的其他窗口交互
模态对话框用 exec() 函数显示,或者在 show() 函数之前加上 setModal(true)
非模态对话框用 show() 函数显示
// dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = nullptr);
~Dialog();
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
// dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
// main.cpp
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
// w.setModal(true);
// w.exec();
w.show();
return a.exec();
}
三.QMainWindow
MainWindow类提供一个有菜单条 工具栏 状态条的主应用程序窗口
它是最常见的GUI主窗口形式,它由外到内依次是菜单栏 状态栏 工具栏 停靠窗口 中心窗口
//One.pro
#-------------------------------------------------
#
# Project created by QtCreator 2019-06-18T13:29:09
#
#-------------------------------------------------
# 表示项目加入core gui模块,用于GUI设计的类库模块
QT += core gui
# 条件执行语句,当QT主版本大于4才加入widgets模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
# 生成的目标可执行文件名称
TARGET = One
# 项目使用的模板是app,一般应用程序
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
CONFIG += c++11
#QT会自动修改以下新增/删除文件
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
//mainwindow.h
QWidget是所有用户界面对象的基类,QMainWindow和QDialog都是QWidget的子类
QMainWindow类提供一个菜单条/工具条/状态条的主应用程序窗口
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
//main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
//hellodialog.ui
可视化设计的窗体的定义文件,是一个XML文件
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
{
//重置窗口大小
resize(600, 400);
//菜单栏创建
QMenuBar* bar = menuBar();
//将菜单栏放入窗口中
setMenuBar(bar);
//创建菜单
QMenu* fileMenu = bar->addMenu("文件");
QMenu* editMenu = bar->addMenu("编辑");
//创建菜单项
QAction* newAction = fileMenu->addAction("新建");
//添加分隔符
fileMenu->addSeparator();
//
QAction* openAction = 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("a", this);
toolBar->addWidget(btn);
}