一.基本部件:
#include <QWidget>
class LayoutGui : public QWidget
Widget 控件(组件)在创建时是不可见的,它可以包含子控件,在删除该 Widget 时,子控件也将一
起删除。
#include <QLCDNumber>
class LcdNumberGui : public QLCDNumber
#include <QDebug> //调试类
#include <QInputDialog> //标准输入框
#include <QListWidget>
#include <QTextEdit>
indiv_edit = new QTextEdit;
#include <QDialog>
#include <QTableWidget> //表格组件:内置了网络布局
#include <QTableView>
#include <QListWidget> //列表组件:
#include <QListView>
#include <QTreeWidget> //树形组件:
#include <QTreeView>
#include <QColumnView>
#include <QTableWidgetItem> //表项
#include <QLabel>
#include <QPixmap>
#include <QMouseEvent> //鼠标事件
#include <QKeyEvent> //按键事件
#include <QLCDNumber>
按钮:
//QAbstractButton类
1.是按钮部件的抽象基类,提供了按钮所共有的功能。
2.实现了一个抽象按钮,并且让它的子类来指定如何处理用户的动作,并指定如何绘制按钮。
3.提供了点击和勾选按钮。
QRadioButton和QCheckBox类只提供了勾选按钮,
QPushButton和QToolButton提供了点击按钮,如果需要的话,它们还可以提供切换行为。
任何按钮,都可以显示一个包含文本和图标的标签。setText()用来设置文本,setIcon()可以置图标。如果按钮被禁用,其标签更改为“disabled”样式。
常用状态:
isDown() 按钮是否被按下。
isChecked() 按钮是否被选中。只有切换按钮才能被切换为选中或不选中(请看下面)。
isEnabled() 按钮是否可以被用户按下。
setAutoRepeat() 如果用户按下按钮,按钮是否可以自动回复。
setToggleButton() 按钮是否是一个切换按钮。
信号:QAbstractButton提供了四个信号:
pressed() 当鼠标光标在按钮内,鼠标左键被按下时,发送此信号。
released() 当鼠标左键被释放时,发送此信号。
clicked() 当按钮被按下然后又被释放,或按下快捷键,或当animateClick()被调用时,发送此信号。
toggled() 当切换按钮的状态变化时,发送此信号。
使用:
QAbstractButton *pButton = new QPushButton(this);
// 设置图标、图标大小、文本
pButton->setIcon(QIcon(":/Images/logo"));
pButton->setIconSize(QSize(18, 18));
pButton->setText("Click Me");
// 连接信号与槽
connect(pButton, &QAbstractButton::clicked, this, &MainWindow::onClicked);
void MainWindow::onClicked()
{
qDebug() << "Enter..."; //点击按钮时,就会输出信息”Enter…”。
}
互斥:只能选中一个按钮
raidobutton_1->setCheckable(true); //设置可选
raidobutton_1->setChecked(true); //设置选中
//QPushButton //命令按钮
QPushButton *file_button = new QPushButton("文 件");
//QtoolButton //工具按钮 //ToolButton 控件
QToolButton类提供了用于命令或选项可以快速访问的按钮,通常可以用在QToolBar里面。
工具按钮和普通的命令按钮不同,通常不显示文本,而显示图标。
//RadioButton 单选按钮,切换按钮
QRadioButton部件提供了一个带有文本标签的单选框(单选按钮)。
可以切换选中(checked)或未选中(unchecked)状态的选项按钮
raidobutton_1 = new QRadioButton("男");
raidobutton_1->setCheckable(true); //可选
raidobutton_1->setChecked(true); //选中
raidobutton_2 = new QRadioButton("女");
raidobutton_2->setCheckable(true);
//按钮组QButtonGroup //单选按钮做互斥
如果你需要为属于同一父部件的单选框设置多个互斥按钮组,把它们加入QButtonGroup中。
QButtonGroup *button_group = new QButtonGroup;
button_group->addButton(raidobutton_1);
button_group->addButton(raidobutton_2);
//QCheckBox //复选框,选项按钮,可多选
like_box_1 = new QCheckBox("足 球");
like_box_1->setCheckable(true);
like_box_1->setChecked(true);
like_box_2 = new QCheckBox("蓝 球");
like_box_2->setCheckable(true);
QSpinBox和QDoubleSpinBox均派生自QAbstractSpinBox
QSpinBox旨在处理整数和离散值(例如:月份名称)
QDoubleSpinBox则用于处理浮点值。默认的精度是2位小数,但可以通过setDecimals()来改变。
他们之间的区别就是处理数据的类型不同,其他功能都基本相同。
//QSpinBox做年龄
QSpinBox *age_box;
age_box = new QSpinBox;
age_box->setRange(1,300); // 范围
age_box->setSingleStep(1); // 步长
age_box->setValue(24); // 当前值(默认值)
//QDoubleSpinBox
上面的所有功能对于QDoubleSpinBox同样适用。
主要使用setDecimals()设置精度,然后利用setSingleStep()来设置步长即可。
QDoubleSpinBox *pSpinBox = new QDoubleSpinBox(this);
pSpinBox->setRange(0, 20); // 范围
pSpinBox->setDecimals(3); // 精度
pSpinBox->setSingleStep(0.005); // 步长
//QToolBox类: 提供了一个列(选项卡式的)部件条目
可以在一个tab列上显示另外一个,并且当前的item显示在当前的tab下面。
每个tab都在tab列中有一个索引位置。tab的item是一个QWidget 。
1.创建QGroupBox,并设置布局管理器为竖直布局
QGroupBox *group_1 = new QGroupBox;
QVBoxLayout *vlayout_1 = new QVBoxLayout(group_1);
2.创建QToolButton,将把按钮加入竖直布局
QToolButton *button_1_1 = this->add_button("贝 贝","://images/bb.png");
QToolButton *button_1_2 = this->add_button("京 京","://images/jj.png");
QToolButton *button_1_3 = this->add_button("欢 欢","://images/hh.png");
//封装,添加用户函数
QToolButton *MyQQ::add_button(const QString &name,const QString &path) //添加一个用户
{
QToolButton *toolbutton_1_1 = new QToolButton;
toolbutton_1_1->setText(name); //设置按钮文本
toolbutton_1_1->setIcon(QIcon(path)); //设置按钮图片
toolbutton_1_1->setIconSize(QSize(ICONWIDTH,ICONHEIGHT)); //设置按钮大小
toolbutton_1_1->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); //设置图片和文本的样式
toolbutton_1_1->setAutoRaise(true); //设置自动弹出
this->connect(toolbutton_1_1,SIGNAL(clicked(bool)),this,SLOT(slot_message()));
return toolbutton_1_1;
}
对话框:
#include <QFrame> //框架
Frame 控件(框架)用来存放其他控件,也可用于装饰。它一般用来作为更加复杂容器的基础,也可
以用在 form 中作为占位控件。
//单行文本框
QLineEdit:是一个单行文本输入框。
1.允许用户输入和编辑单行纯文本,提供了很多有用的编辑功能,包括:撤消和重做、剪切和粘贴、拖放
2.通过改变输入框的echoMode(),同时也可以设置为一个“只写”字段,用于输入密码等。
3.文本的长度可以被限制为maxLength(),可以使用一个validator()或inputMask()来任意限制文本
QLineEdit *lineEdit; //声明 QLineEdit 控件
lineEdit = new QLineEdit(this); //创建 QLineEdit 控件
lineEdit->setGeometry(QRect(100,100,200,25)); //位置大小
//文本域,多行文本框
QTextEdit:可以使用setText()或insert()来改变文本,通过text()来获取文本;
QTextEdit *textEdit; //声明
textEdit = new QTextEdit(this); //实例 QTextEdit 控件
textEdit->setGeometry(QRect(50,50,200,150)); //控件位置大小
textEdit->setText("我是第一行<br/>我是第二行"); //内容
//下拉列表框
#include <QComboBox> //下拉列表
QComboBox *comboBox; //声明
comboBox = new QComboBox(this); //构造控件
//edu_box->addItem("高 中");
comboBox->setGeometry(QRect(50,50,120,25)); //控件显示位置大
QStringList str;
str << "数学" << "语文" << "地理"; //定义字符串列表
comboBox->addItems(str); //将字符串列表绑定 QComboBox 控件
//整形分量框
#include <QSpinBox>
QSpinBox *spinBox; //声明控件
spinBox = new QSpinBox(this); //创建
spinBox->setGeometry(QRect(50,50,100,25)); //位置
spinBox->setRange(0,200); //值范围
spinBox->setValue(10); //初始值
spinBox->setSuffix("元"); //后缀
spinBox->setPrefix("$"); //前缀
//套路:
一个待输入的框,一个按钮,通过按钮来设置这个框的“字体,颜色,填入文件名,填充名字,修改图片等”
1.构造框和按钮,
2.设置连接槽函数
3.槽函数实现:
获得相关图片地址,文件地址,名字/性别/年龄等
通过框的设置函数,将获得的内容赋给框
//标准文件对话框:获取文件名
#include <QFileDialog>
QLineEdit *fileedit; //声明文件对话框
fileedit = new QLineEdit; //构建对话框
//构造按钮
//连接槽函数
this->connect(file_button,SIGNAL(clicked(bool)),this,SLOT(slot_getFile()));
void DialogGui::slot_getFile()//获取文件名的槽函数
{
qDebug() << __func__ << endl; //Qt中输出要用调试输出
//打开文件对话框,获取文件路径,修改lineedit的内容
QString path = QFileDialog::getOpenFileName(this,"文件对话框","D:\\","C++头文件(*.h);;C++源文件(*.cpp);;所有文件(*.*)"); //打开文件对话框
if(!path.trimmed().isEmpty()) //判断用户是否点击打开,trimmed()去除首尾空格
fileedit->setText(path); //通过文本的设置函数,将获得的文本地址赋给框
}
//字体对话框:设置字体
#include <QFontDialog>
QLineEdit *fontedit; //声明对话框
fontedit = new QLineEdit("中国,加油"); //构建对话框,并初始化
//构造按钮 。。。
//连接槽函数
this->connect(font_button,SIGNAL(clicked(bool)),this,SLOT(slot_getFont()));
void DialogGui::slot_getFont()
{
qDebug() << __func__ << endl; //Qt中输出要用调试输出
bool isok = false; //打开字体对话框
QFont font = QFontDialog::getFont(&isok,QFont("隶书",35),this,"字体对话框");
if(isok) //如果为true表示用户点击了确定
fontedit->setFont(font); //通过字体的设置函数,将获得的字体赋给框
}
//颜色对话框:颜色填充
#include <QColorDialog>
QFrame *colorFrame; //声明颜色的方框
colorFrame = new QFrame; //构造方框
colorFrame->setFrameShape(QFrame::Box); //设置方框的形状
colorFrame->setAutoFillBackground(true); //设置方框的背景颜色自动填充
//构造按钮 。。。
//连接槽函数
this->connect(color_button,SIGNAL(clicked(bool)),this,SLOT(slot_getColor()));
void DialogGui::slot_getColor() //获取颜色
{
qDebug() << __func__ << endl; //Qt中输出要用调试输出
QColor color = QColorDialog::getColor(Qt::red,this,"颜色对话框");
if(color.isValid()) //验证颜色数是否有效
{
//设置颜色:通过Palette去设置颜色
colorFrame->setPalette(QPalette(color));//通过颜色的设置函数,将获得的颜色赋给框
}
}
//标准输入框:手动输入,如输入名字,年龄等信息;
#include <QInputDialog>
name_label = new QLabel; //构造一个文本框
name_label->setAlignment(Qt::AlignCenter); //设置label上的文本居中
name_label->setFrameStyle(QFrame::Panel | QFrame::Sunken); //设置label的样式为panel和sunken
QPushButton *name_button = new QPushButton; //构造一个按钮
name_button->setIcon(QIcon("://images/btn.png"));//给按钮做一个图片
//连接槽函数
this->connect(name_button,SIGNAL(clicked(bool)),this,SLOT(slot_getName()));
void InputDialogGui::slot_getName() //设置槽函数实现功能
{
//打开文本输入框,获取得文本,设置到label中
bool ok = false;
QString name = QInputDialog::getText(this,"文本输入框","请输入姓名:",QLineEdit::Normal,"张 三",&ok);
if(ok && !name.trimmed().isEmpty()) //如果 用户点击了确定
name_label->setText(name); //通过框的设置函数,将获得的名字赋给框
}
//下面三个分别实现
//年龄(选项输入框getItem),性别(整型输入框getInt),身高(浮点型输入框getDouble)
void InputDialogGui::slot_getSex() //1.年龄(选项输入框getItem)
{
QStringList sexlist;
sexlist.push_back("男");
sexlist.push_back("女");
sexlist.push_back("人妖");
bool ok = false;
QString sex = QInputDialog::getItem(this,"选项输入框","请选择性别:",sexlist,1,false,&ok);
if(ok)
sex_label->setText(sex);
}
void InputDialogGui::slot_getAge() //2.性别(整型输入框getInt)
{
bool ok = false;
int age = QInputDialog::getInt(this,"整型输入框","请输入年龄:",24,1,300,2,&ok);
if(ok)
age_label->setText(QString::number(age));
}
void InputDialogGui::slot_getHeight() //3.身高(浮点型输入框getDouble)
{
bool ok = false;
qreal height = QInputDialog::getDouble(this,"浮点型输入框:","请输入身高:",150,1,300,1,&ok);
if(ok)
height_label->setText(QString::number(height));
}
#include <QMessageBox> //标准消息对话框
QPushButton *question_button = new QPushButton(tr("question"));
this->connect(question_button,SIGNAL(clicked(bool)),this,SLOT(slot_question()));
void MessageBoxGui::slot_question()
{
int button = QMessageBox::question(this,tr("question message box"),tr("are you close file?"),QMessageBox::Ok | QMessageBox::Cancel);
if(button == QMessageBox::Ok) //表示用户点击了OK按钮
messlabel->setText(tr("question/ok")); //在实际使用中,应该实现实际功能
else if(button == QMessageBox::Cancel) //表示用户点击了cancel按钮
messlabel->setText(tr("question/cancel"));
} //以上未系统的消息对话框
//自定义的消息对话框
QPushButton *constom_button = new QPushButton(tr("constom"));
this->connect(constom_button,SIGNAL(clicked(bool)),this,SLOT(slot_comstum()));
void MessageBoxGui::slot_comstum() //利用槽函数自定义消息对话框
{
//1.创建消息对话框对象
QMessageBox constom_mbox;
//2.设置对话框的属性
constom_mbox.setWindowTitle(tr("comstum message box"));
constom_mbox.setIconPixmap(QPixmap("://images/linuxredhat.png"));
constom_mbox.setText(tr("this is my comstum message box"));
//3.添加按钮
QPushButton *lock_button = constom_mbox.addButton(tr("lock"),QMessageBox::ActionRole);
QPushButton *unlock_button = constom_mbox.addButton(tr("unlock"),QMessageBox::ActionRole);
QPushButton *cancel_button = constom_mbox.addButton(QMessageBox::Cancel);
//4.运行
// constom_mbox.show(); //error,无法判断用户点击的按钮
constom_mbox.exec(); //对于dialog及子类的显示必须调用exec();
//5.获取用户点击的按钮,判断
QAbstractButton *button = constom_mbox.clickedButton(); //获取用户点击的按钮,
if(button == lock_button)
messlabel->setText(tr("constum/lock"));
else if(button == unlock_button)
messlabel->setText(tr("constum/unlock"));
else if(button == cancel_button)
messlabel->setText(tr("constum/cancel"));
}
时间:
#include <QDateTimeEdit> //日期时间编辑器
提供了一个部件,用于编辑日期和时间。
通过使用键盘或箭头键来增加和减少日期和时间值。
日期和时间的格式按照setDisplayFormat()设置的显示。
// 设置日期时间格式
QDateTimeEdit *dateTimeEdit = new QDateTimeEdit(this);
QDateTimeEdit *dateTimeEdit2 = new QDateTimeEdit(QDateTime::currentDateTime(), this);
QDateTimeEdit *dateEdit = new QDateTimeEdit(QDate::currentDate(), this);
QDateTimeEdit *timeEdit = new QDateTimeEdit(QTime::currentTime(), this);
dateTimeEdit->setDisplayFormat("yyyy-MM-dd HH:mm:ss");
dateTimeEdit2->setDisplayFormat("yyyy/MM/dd HH-mm-ss");
dateEdit->setDisplayFormat("yyyy.M.d");
timeEdit->setDisplayFormat("H:mm");
yyyy:年,4个数表示。
MM:月,01-12。
dd:日,01-31。
HH:时,00-23。
mm:分,00 - 59。
ss:秒,00-59。
QDateEdit和QTimeEdit均继承自QDateTimeEdit,许多特性和功能都有QDateTimeEdit提供。
不要用QDateEdit来设置或获取时间,也不要用QTimeEdit来设置或获取日期。如果要同时操作日期时间,请使用QDateTimeEdit。
//dateEdit->setDisplayFormat("yyyy/MM/dd");
//timeEdit->setDisplayFormat("HH:mm:ss");
//时间编辑器
#include <QTimeEdit>
time:保存了部件的显示时间。
minimumTime:定义了用户可以设置的最小时间。
maximumTime:定义了用户可以设置的最大时间。
displayFormat:包含了一个字符串用于格式化时间
QTimeEdit *timeEdit = new QTimeEdit(QTime::currentTime(), this);
//日期控件
#include <QDateEdit>
date:保存了部件的显示日期。
minimumDate:定义了用户可以设置的最小日期。
maximumDate:定义了用户可以设置的最大日期。
displayFormat:包含了一个字符串用于格式化日期。
QDateEdit *dateEdit = new QDateEdit(QDate::currentDate(), this);
//日期时间
#include <QDateTime>
QDateTime dateTime = dateEdit->dateTime();
//日期类
#include <QDate>
QDate date = dateEdit->date();
//时间类
#include <QTime>
QTimeEdit *timeEdit; //声明
timeEdit = new QTimeEdit(this); //构造控件
timeEdit->setGeometry(QRect(50,50,120,25)); //位置
QDateTime sysTime = QDateTime::currentDateTime();//获取系统时间
//获取时分秒以“:”号拆分赋予 list 数组
QStringList list = sysTime.toString("hh:mm:ss").split(':');
//将时分秒绑定控件 timeEdit- >setTime(QTime(list[0].toInt(),list[1].toInt(),list[2].toInt()));
bdate_edit_1->setDate(bdate); //设置日期
bdate_edit_1->setDisplayFormat("yyyy年M月dd日"); //设置日期显示格式
bdate_edit_1->setCalendarPopup(true); //弹出日历
//1.获取时间并转化为字符串
QTime time = QTime::currentTime();
QString tim_str = time.toString("hh:mm");
//2.根据isshow控制符来决定是否显示:
if(isshow)
tim_str[2] = ':';
else
tim_str[2] = ' ';
//3.显示时间字符串
this->display(tim_str);
//实时更新时间
#include <QTimer>
QTimer *timer; //声明
timer = new QTimer;
connect(timer,SIGNAL(timeout()),this,SLOT(timerTime()));
void MainWindow::timerTime(){
QDateTime sysTime = QDateTime::currentDateTime();//获取系统时间
label->setText(sysTime.toString());
}
控件:
QLCDNumber控件用于显示一个LCD数字。
它可以显示几乎任意大小的数字。可以显示十进制、十六进制、八进制或二进制数。很容易使用display()槽连接到数据源,这个槽可以被任何五个参数类型的数据源重载。
当显示范围以外的数据时,就会发射overflow()信号。返回可以通过setDigitCount()来设置,但是setSmallDecimalPoint() 也会影响它。如果显示设置为十六进制、八进制或二进制,就会显示整数等效值
窗口:
1.设置窗口标题,大小
this->setWindowTitle("标准对话框示例"); //设置窗口标题
this->setWindowTitle("Qt5.1 窗体应用");//窗体标题
this->setMaximumSize(300,300);//窗体最大 300*300
this->setMinimumSize(300,300);//窗体最小 300*300
2.窗口位置大小
菜单:
Qt中要建立菜单,有三个类很重要:
QMenuBar(QWidget * parent = 0)
QMenu(QWidget * parent = 0)
QMenu(const QString & title, QWidget * parent = 0)
QAction(QObject * parent)
QAction(const QString & text, QObject * parent)
QAction(const QIcon & icon, const QString & text, QObject * parent)
QMenuBar: 就是所有窗口的菜单栏,在此基础上添加不同的QMenu和QAction
QMenu: 菜单栏里面菜单,可以显示文本和图标,但是并不负责执行操作,有点类似label的作用
QAction: Qt 将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示。QAction才是真正负责执行操作的部件。
二.布局管理器:
所有QWidget子类可以使用布局来管理他们的子控件。QWidget::setLayout()函数可以为一个控件布局。当通过这种方式布局以后,它负责以下任务:
布置子控件。
最高层窗口可感知的默认大小。
最高层窗口可感知的最小大小。
调整大小的处理。
当内容改变的时候自动更新:
字体大小、文本或者子控件的其它内容。
隐藏或者显示子控件。
移除一些子控件。
布局:
//网格布局
QGridLayout:把子窗口排列在一个二维的网格中,窗口可占据多个单元格。
QGridLayout *left_layout = new QGridLayout;
left_layout->addWidget(lable_1,0,0); //lable_1 nameedit
left_layout->addWidget(nameedit,0,1); //lable_2 sex_hlayout
left_layout->addWidget(lable_2,1,0);
left_layout->addLayout(sex_hlayout,1,1);
//竖直布局
QVBoxLayout:把子窗口从上到下排列在一个垂直列上。
QVBoxLayout *right_layout = new QVBoxLayout;
right_layout->addLayout(head_layout);
right_layout->addWidget(label_10);
right_layout->addWidget(indiv_edit);
//水平布局
QHBoxLayout:把子窗口从左到右排列在一个水平行上。
sex_hlayout->addWidget(raidobutton_1);
sex_hlayout->addWidget(raidobutton_2);
sex_hlayout->addStretch(); //添加了一个伸缩空间
//在第一个控件之前添加伸缩,这样所有的控件就会居右显示。
//在最后一个控件之后添加伸缩,这样所有的控件就会居左显示。
//在第一个控件之前、最后一个控件之后添加伸缩,这样所有的控件就会居中显示。
//在每一个控件之间都添加伸缩,这样所有的控件之间的间距都会相同。
//表单布局
QFormLayout:管理输入型控件和关联的标签组成的那些Form表单。
把子窗口按照标签-输入框的形式排列在两列。
两列和若干行组成的形式时,QFormLayout更为方便些
多行多列,应毫不犹豫的尽量使用栅格布局QGridLayout
QFormLayout *pLayout = new QFormLayout();
pLayout->addRow(QStringLiteral("用户名:"), pUserLineEdit);
pLayout->addRow(QStringLiteral("密码:"), pPasswordLineEdit);
pLayout->addRow(QStringLiteral("验证码:"), pVerifyLineEdit);
pLayout->setSpacing(10);
pLayout->setMargin(10);
setLayout(pLayout);
通过addRow()来创建一个带有给定文本的QLabel及QWidget控件行,它们可以自动的设置为伙伴关系。
//控制表单行的显示策略
QFormLayout::RowWrapPolicy枚举:
QFormLayout::DontWrapRows 0 输入框始终在标签旁边
QFormLayout::WrapLongRows 1 标签有足够空间适应,最小大小比可用空间大,输入框会被换到下一行
QFormLayout::WrapAllRows 2 输入框始终在标签下边
//窗体布局
QstackLayout
间隔器:
水平间隔器:Horizontal Spacer
竖直间隔器:Vertical Spacer