类继承关系
第一节 基础窗口部件QWidget
1.窗口部件QWidget
QWidget类是所有用户界面对象的基类,被称为基础窗口部件。
QWidget继承自QObject类和QPaintDevice类,其中QObject类是所有支持Qt对象模型(Qt Object Model)的Qt对象的的基类,QPaintDevice类是所有可以绘制的对象的基类。
2.窗口、子部件以及窗口类型
(1)窗口
把没有嵌入到其他部件中的部件称为窗口,一般的,窗口都有边框和标题栏。
QWidget *widget = new QWidget(); // 新建QWidget类对象,默认parent参数是0,所以它是个窗口
QLabel *label = new QLabel(); // 新建QLabel对象,默认parent参数是0,所以它是个窗口
QLabel *label2 = new QLabel(widget); // label2指定了父窗口为widget,所以不是窗口
(2)子部件
QMainWindow和大量的QDialog子类是最一般的窗口类型。窗口就是没有父部件的部件,所以又称为顶级部件(top-level widget)。
与其相对的是非窗口部件,又称为子部件(child widget)。
(3)窗口类型
QWidget的构造函数有两个参数:QWidget * parent = 0和Qt::WindowFlags f = 0;
前面的parent就是指父窗口部件,默认值为0,表明没有父窗口;
后面的f参数是Qt::WindowFlags类型的,它是一个枚举类型,分为窗口类型(WindowType)和窗口标志(WindowFlags)。
前者可以定义窗口的类型,比如我们这里f=0,表明使用了Qt::Widget一项,这是QWidget的默认类型,这种类型的部件如果有父窗口,那么它就是子部件,否则就是独立的窗口。
当更改窗口类型后,窗口的样式会发生改变,
QWidget *widget = new QWidget(0, Qt::Dialog); //对话框类型
QLabel *label = new QLabel(0, Qt::SplashScreen); //欢迎窗口类型
而对于窗口标志,它主要的作用是更改窗口的标题栏和边框,而且它们可以和窗口类型进行位或操作。
QWidget *widget = new QWidget(0, Qt::Dialog | Qt::FramelessWindowHint); //用来产生一个没有边框的窗口
QLabel *label = new QLabel(0, Qt::SplashScreen | Qt::WindowStaysOnTopHint); //用来使该窗口停留在所有其它窗口上面
3.窗口的集几何布局
对于窗口的大小和位置,根据是否包含边框和标题栏两种情况,要用不同的函数来获取它们的数值。
这里的函数分为两类,一类是包含框架的,一类是不包含框架的:
包含框架:
x():返回部件的位置坐标的x值
y():返回部件的位置坐标的y值
frameGeometry():返回包含边框的窗口框架矩形的值,其返回值是QRect类型的,它的形式是(位置坐标,大小信息),也就是(x,y,宽,高)
pos():返回窗口的位置
move():设置窗口位置
不包含框架:
geometry():返回没有边框的窗口框架矩形的值,其返回值是QRect类型的,它的形式是(位置坐标,大小信息),也就是(x,y,宽,高)
width():返回窗口内部的宽
height():返回窗口内部的高
rect():返回不包含边框的窗口内部矩形
size():返回不包含边框的窗口大小信息
resize():设置不包含边框的窗口大小
补充:qDebug()函数
两种输出方式:
方式一:直接将字符串当做参数传给qDebug()函数 如: qDebug("x: %d", x); // 输出x的值
方式二:使用输出流的方式一次输出多个值,它们的类型可以不同, 如:qDebug() << "geometry: " << geometry << "frame: " << frame; //输出geometry和frame的值
需要说明的是,如果只使用第一种方法,那么是不需要添加头文件的,如果使用第二种方法就必须添加这个头文件。
第二种方法时还可以让输出自动换行,qDebug() << endl; //endl起换行作用
第二节 对话框
1.模态和非模态对话框
模态对话框就是在我们没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互。
要想使一个对话框成为模态对话框,只需要调用它的exec()函数:
QDialog dialog(this);
dialog.exec();
非模态对话框,既可以与它交互,也可以与同一程序中的其他窗口交互。
要使一个对话框成为非模态对话框,我们就可以使用new操作来创建,然后使用show()函数来显示:
QDialog *dialog = new QDialog(this);
dialog->show();
使用show()函数也可以建立模态对话框,只需在其前面使用setModal()函数即可。例如:
QDialog *dialog = new QDialog(this); //它与用exec()函数时的效果是不一样的。
dialog->setModal(true); //这是因为调用完show()函数后会立即将控制权交给调用者,那么程序可以继续往下执行。
dialog->show(); //而调用exec()函数却不是这样,它只有当对话框被关闭时才会返回。
与setModal()函数相似的还有一个setWindowModality()函数,它有一个参数来设置模态对话框要阻塞的窗口类型,可以是:
Qt::NonModal(不阻塞任何窗口,就是非模态),
Qt::WindowModal(阻塞它的父窗口和所有祖先窗口以及它们的子窗口),
Qt::ApplicationModal(阻塞整个应用程序的所有窗口)。
2.多窗口切换
(1)信号与槽
用来完成对象之间的协同操作。简单来说,信号和槽都是函数,比如按下窗口上的一个按钮后想要弹出一个对话框,那么就可以将这个按钮的单击信号和我们定义的槽关联起来,在这个槽中可以创建一个对话框,并且显示它。
这样,当单击这个按钮时就会发射信号,进而执行我们的槽来显示一个对话框。
关联方式:
①使用connect函数关联:
connect()函数中的四个参数分别是:发送信号的对象、发送的信号、接收信号的对象和要执行的槽。
②在设计模式关联
③自动关联
(2)使用自定义对话框登陆主界面
//在main()函数中:
QApplication a(argc, argv);
MyWidget w;
MyDialog dialog; // 新建MyDialog类对象
if(dialog.exec()==QDialog::Accepted){ // 判断dialog执行结果
w.show(); // 如果是按下了“进入主界面”按钮,则显示主界面
return a.exec(); // 程序正常运行
}
else return 0;
(3)标准对话框
//颜色对话框
void MyWidget::on_pushButton_clicked()
{
//QColor color = QColorDialog::getColor(Qt::red, this, tr("颜色对话框"), QColorDialog::ShowAlphaChannel);
QColorDialog dialog(Qt::red, this); // 创建对象
dialog.setOption(QColorDialog::ShowAlphaChannel); // 显示alpha选项
dialog.exec(); // 以模态方式运行对话框
QColor color = dialog.currentColor(); // 获取当前颜色
qDebug() << "color: " << color;
}
//文件对话框
void MyWidget::on_pushButton_2_clicked()
{
// QString fileName = QFileDialog::getOpenFileName(this, tr("文件对话框"),
// "D:", tr("图片文件(*png *jpg);;文本文件(*txt)"));
// qDebug() << "fileName:" << fileName;
QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("文件对话框"),
"D:", tr("图片文件(*png *jpg)"));
qDebug()<< "fileNames:" << fileNames;
}
//字体对话框
void MyWidget::on_pushButton_3_clicked()
{
// ok用于标记是否按下了“OK”按钮
bool ok;
QFont font = QFontDialog::getFont(&ok, this);
// 如果按下“OK”按钮,那么让“字体对话框”按钮使用新字体
// 如果按下“Cancel”按钮,那么输出信息
if (ok) ui->pushButton_3->setFont(font);
else qDebug() << tr("没有选择字体!");
}
//输入对话框
void MyWidget::on_pushButton_4_clicked()
{
bool ok;
// 获取字符串
QString string = QInputDialog::getText(this, tr("输入字符串对话框"),tr("请输入用户名:"), QLineEdit::Normal,tr("admin"), &ok);
if(ok) qDebug() << "string:" << string;
// 获取整数
int value1 = QInputDialog::getInt(this, tr("输入整数对话框"),tr("请输入-1000到1000之间的数值"), 100, -1000, 1000, 10, &ok);
if(ok) qDebug() << "value1:" << value1;
// 获取浮点数
double value2 = QInputDialog::getDouble(this, tr("输入浮点数对话框"),tr("请输入-1000到1000之间的数值"), 0.00, -1000, 1000, 2, &ok);
if(ok) qDebug() << "value2:" << value2;
QStringList items;
items << tr("条目1") << tr("条目2");
// 获取条目
QString item = QInputDialog::getItem(this, tr("输入条目对话框"),tr("请选择或输入一个条目"), items, 0, true, &ok);
if(ok) qDebug() << "item:" << item;
}
//消息对话框
void MyWidget::on_pushButton_5_clicked()
{
// 问题对话框
int ret1 = QMessageBox::question(this, tr("问题对话框"),tr("你了解Qt吗?"), QMessageBox::Yes, QMessageBox::No);
if(ret1 == QMessageBox::Yes) qDebug() << tr("问题!");
// 提示对话框
int ret2 = QMessageBox::information(this, tr("提示对话框"),tr("这是Qt书籍!"), QMessageBox::Ok);
if(ret2 == QMessageBox::Ok) qDebug() << tr("提示!");
// 警告对话框
int ret3 = QMessageBox::warning(this, tr("警告对话框"),tr("不能提前结束!"), QMessageBox::Abort);
if(ret3 == QMessageBox::Abort) qDebug() << tr("警告!");
// 错误对话框
int ret4 = QMessageBox::critical(this, tr("严重错误对话框"),tr("发现一个严重错误!现在要关闭所有文件!"), QMessageBox::YesAll);
if(ret4 == QMessageBox::YesAll) qDebug() << tr("错误");
// 关于对话框
QMessageBox::about(this, tr("关于对话框"),tr("yafeilinux致力于Qt及Qt Creator的普及工作!"));
}
//进度对话框
void MyWidget::on_pushButton_6_clicked()
{
QProgressDialog dialog(tr("文件复制进度"), tr("取消"), 0, 50000, this);
dialog.setWindowTitle(tr("进度对话框")); // 设置窗口标题
dialog.setWindowModality(Qt::WindowModal); // 将对话框设置为模态
dialog.show();
for(int i=0; i<50000; i++) { // 演示复制进度
dialog.setValue(i); // 设置进度条的当前值
QCoreApplication::processEvents(); // 避免界面冻结
if(dialog.wasCanceled()) break; // 按下取消按钮则中断
}
dialog.setValue(50000); // 这样才能显示100%,因为for循环中少加了一个数
qDebug() << tr("复制结束!");
}
//错误信息对话框
void MyWidget::on_pushButton_7_clicked()
{
errordlg->setWindowTitle(tr("错误信息对话框"));
errordlg->showMessage(tr("这里是出错信息!"));
}
QWizardPage * MyWidget::createPage1() // 向导页面1
{
QWizardPage *page = new QWizardPage;
page->setTitle(tr("介绍"));
return page;
}
QWizardPage * MyWidget::createPage2() // 向导页面2
{
QWizardPage *page = new QWizardPage;
page->setTitle(tr("用户选择信息"));
return page;
}
QWizardPage * MyWidget::createPage3() // 向导页面3
{
QWizardPage *page = new QWizardPage;
page->setTitle(tr("结束"));
return page;
}
//向导对话框
void MyWidget::on_pushButton_8_clicked()
{
QWizard wizard(this);
wizard.setWindowTitle(tr("向导对话框"));
wizard.addPage(createPage1()); // 添加向导页面
wizard.addPage(createPage2());
wizard.addPage(createPage3());
wizard.exec();
}
三、窗口部件
1.QFrame类族
QFrame类是带有边框的部件的基类。它的子类有我们最为常用的标签部件QLabel,另外还有QLCDNumber、QSplitter、QStackedWidget、QToolBox和QAbstractScrollArea类。
带边框部件最主要的特点就是可以有一个明显的边界框架。QFrame类的主要功能也就是用来实现不同的边框效果,这主要是由边框形状(Shape)和边框阴影(Shadow)组合来形成的。
AFrame类:
●共有类型
enum Shadow { Plain, Raised, Sunken }
enum Shape { NoFrame, Box, Panel, StyledPanel, ..., WinPanel }
enum StyleMask { Shadow_Mask, Shape_Mask }
●属性
frameRect : QRect//控件矩形
frameWidth : const int//框架的宽度
frameShadow : Shadow//有无阴影
lineWidth : int//线宽度
frameShape : Shape//框架形状
midLineWidth : int//中间线的宽度
●公有函数
QFrame(QWidget * parent = 0, Qt::WindowFlags f = 0)//构造函数,设置主窗口和框架类型
~QFrame()//析构函数
QRect frameRect() const//返回 框架的rect
Shadow frameShadow() const
Shape frameShape() const
int QFrame::frameStyle() const//返回框架风格,类似frameShadow()
int frameWidth() const
int lineWidth() const
int midLineWidth() const
void setFrameRect(const QRect &)
void setFrameShadow(Shadow)
void setFrameShape(Shape)
void setFrameStyle(int style)
void setLineWidth(int)
void setMidLineWidth(int)
●重写公有函数
virtual QSize sizeHint() const//返回尺寸大小
●保护函数
void initStyleOption(QStyleOptionFrame * option) const//初始化画一个框架
●公有保护函数
virtual void changeEvent(QEvent * ev)//事件状态改变
virtual bool event(QEvent * e)//接收事件
virtual void paintEvent(QPaintEvent *)//重绘事件
2.按钮部件
QAbstractButton类是按钮部件的抽象基类,提供了按钮的通用功能。它的子类包括:
①复选框QCheckBox
●QCheckBox组件简介
QCheckBox复选框,复选框提供多选多。
QCheckBox有三种状态:checked、unchecked和PartiallyChecked。
●QCheckBox组件属性
QCheckBox复选框属性设置选项:
A、name:组件对应源代码中所显示的名字。
B、text:组件对应图形界面中所显示的名字。
C、font:设置text字体。
D、enabled:组件是否可用,可用为true,不可用为false。
E、checked:用来设置或返回是否选中单选按钮,选中为true,未选中为false。
●QCheckBox组件常用成员函数
QCheckBox::QCheckBox(const QString &text,QWidget *parent,const char *name = 0)//构造一个名称为name、父对象为parent并且文本为text的复选框。
bool QCheckBox::isChecked()const //选中复选框,返回true,否则返回false。
void QAbstractButton ::setText(const QString &) //设置组件上显示的文本。
QString QAbstractButton ::text()const //返回组件上显示的文本。
void QAbstractButton ::stateChange(int state)[signal] //当更改checked属性时,将发射这个信号。
void QCheckBox::setChecked(bool check)[slot] //设置复选框是否选中,状态为check的值。
②标准按钮QPushButton
●QPushButton组件简介
QPushButton组件用于接受用户点击事件,能够显示提示字符串,是功能性组件,需要父组件作为容器,能够在父组件中进行定位,用于执行命令或触发事件。
QPushButton的类继承如下:
QPushButton :public QAbstractButton :pubic QWidget :public QObject, public QPaintDevice
●QPushButton组件属性
QPushButton 组件属性设置选项:
A、name:组件对应源代码中的名字。
B、text:组件对应图形界面中显示的名字。
C、font:设置text的字体。
D、enabled:组件是否可用。
●QPushButton组件常用成员函数
QPushButton::QPushButton(const QString &text,QWidget *parent,const char *name = 0); //构造一个名称为name,父对象为parent并且文本为text的按压按钮。
void QAbstractButton::setText(const QString &) //设置按钮上显示的文本。
QString QAbstractButton::text()const //返回按钮上显示的文本。
void QAbstractButton::pressed()[signal] //当按下按钮时,发射信号。
void QAbstractButton::clicked()[signal] //当单击按钮时,发射信号。
void QAbstractButton::released()[signal] //当释放按钮时,发射信号。
●QPushButton实例
QPushButton *button = new QPushButton("OK", this);
connect(button, SIGNAL(clicked()), this, SLOT(onOK()));
③单选框按钮QRadioButton
●QRaidoButton组件简介
QRaidoButton单选按钮,用于提供两个或多个互斥选项。
●QRaidoButton组件属性
QRaidoButton单选按钮属性设置选项:
A、name:组件对应源代码中所显示的名字。
B、text:组件对应图形界面中所显示的名字。
C、font:设置text字体。
D、enabled:组件是否可用,可用为true,不可用为false。
E、checked:用来设置或返回是否选中单选按钮,选中为true,未选中为false。
●QRaidoButton组件常用成员函数
QRaidoButton::QRadioButton(const QString &text,QWidget *parent,const char *name = 0)//构造一个名称为name、父对象为parent并且文本为text的单选按钮。
bool QRadioButton::isChecked()const //返回是否选中单选按钮,选中时返回true,没有选中时返回false。
void QAbstractButton ::setText(const QString &) //设置组件上显示的文本。
QString QAbstractButton ::text()const //返回该按钮上显示的文本。
void QAbstractButton ::stateChanged(int state)[signal] //当更改checked属性值时,将发射信号。
void QRadioButton::setChecked(bool check)[virtual slot] //设置单选按钮是否被选中为checked。
④工具按钮QToolButton
●QToolButton组件简介
QToolButton工具按钮,是一种用于命令或者选项的可以快速访问的按钮,通常在ToolBar里面。工具按钮通常显示的是图标,而不是文本标签。
ToolButton支持自动浮起。在自动浮起模式中,按钮只有在鼠标指向它的时候才绘制三维的框架。
●QToolButton组件属性
QToolButton工具按钮设置选项:
A、name:组件对应源代码中的名称。
B、text:工具按钮标签文本。
C、font:设置工具按钮标签的字体。
D、autoRaise:自动浮起是否生效。
E、iconSet:提供显示在按钮上的图标的图标集。
F、on:工具按钮是否为开。
G、textLabel:工具按钮自动提示文本。
H、usesTextLabel:自动提示文本textLabel是否工作,默认为false。
●QToolButton组件常用成员函数
QToolButton::QToolButton(QWidget *parent,const char *name = 0) //构造一个名字为name,父对象为parent的ToolButton。
QToolButton::QToolButton(const QIconset &iconSet,const QString &textLabel,
const QString &grouptext,QObject *receiver,const char *slot,QToolBar *parent,const char *name = 0)
//构造一个名称为name,父对象为parent(必须为QToolBar)的工具按钮。工具按钮将显示iconSet,工具提示为textLabel,
//状态条信息为grouptext,同时会将工具按钮链接到receiver对象的槽函数。
QToolBButton::QToolButton(ArrowType type,QWidget *parent,const char *name = 0)
//把工具按钮构造成箭头按钮,type定义了箭头的方向,可用的值有LeftArrow、RightArrow、UpArrow、DownArrow。
void QToolButton::setAutoRaise(bool enable) //根据参数enable值设置按钮是否可自动浮起。
void QToolButton::setIcon(const QIconSet &) //设置显示在工具按钮上的图标。
void QToolButton::setOn(bool enable)[virtual slot] //设置按钮是否为开,enable等于true则设置为开,否则设置为关。
void QToolButton::setTextLabel(const QString &)[slot] //设置按钮的提示标签。
QString QToolButton::textLabel()const //返回按钮的提示标签。
void setToolButtonStyle( Qt::ToolButtonStyle style ) //设置ToolButton的样式,有下列样式:
Qt::ToolButtonIconOnly只显示图标
Qt::ToolButtonTextOnly只显示文字
Qt::ToolButtonTextBesideIcon文字显示在图标旁
Qt::ToolButtonTextUnderIcon文字显示在图标下
Qt::ToolButtonFollowStyle根据QStyle::StyleHint进行设置
void setPopupMode( ToolButtonPopupMode mode ) //设置ToolButton的菜单弹出方式ToolButtonPopupMode,弹出方式如下:QToolButton::DelayedPopup延迟弹出
QToolButton::MenuButtonPopup菜单弹出
QToolButton::InstantPopup点击立即弹出
3.行编辑器
行编辑器QLineEdit部件是一个单行的文本编辑器,它允许用户输入和编辑单行的纯文本内容,而且提供了一系列有用的功能,
包括撤销与恢复、剪切和拖放等操作。如:
显示模式
Normal:正常显示
NoEcho:不显示任何输入
PassWord:密码样式,以黑点代替显示
PasswordEchoOnEdit:编辑时正常,其余以密码样式显示
输入掩码
目的:限制输入的内容,可使用一些特殊字符设置输入的格式和内容
掩码字符:
输入验证
在cpp文件中添加
QValidator * validator = new QIntValidator(100,999,this); //输入限制为100 ~ 999
ui -> lineEdit -> setValidator(validator);
自动补全
在类的构造函数中添加
QStringList wordlist;
wordlist<<"Qt"<<"Qt Creator"<<QObject::tr("Hello!");//当输入首字母时,有补全提示
QCompleter * completer = new QCompleter(wordlist,this); //新建自动完成器材
completer -> setCaseSensitivity(Qt::CaseSensitive); //区分大小写 CaseInsensitive不区分大小写
ui -> lineEdit -> setCompleter(completer);
4.数值设定框
QAbstractSpinBox类是一个抽象基类,它提供了一个数值设定框和一个行编辑器来显示设定值。它有三个子类:
QDateTimeEdit(日期时间设定)
QSpinBox(整数设定)
QDoubleSpinBox(浮点数的设定)
5.滑块部件
QAbstractSlider类提供了一个区间内的整数值,它有一个滑块,可以定位到一个整数区间的任意值。这个类是一个抽象基类,它有三个子类QScrollBar,QSlider和QDial。其中:
滚动条QScrollBar更多的是用在QScrollArea类中来实现滚动区域;
而QSlider是我们最常见的音量控制或多媒体播放进度等滑块;
继承的信号:
信号 描述
valueChanged() 当滑块的值发生了变换,发射此信号,tracking()确定在用户交互时,是否发出此信号。
sliderPressed() 当用户按下滑块,发射此信号。
sliderMoved() 当用户拖动滑块,发射此信号。
sliderReleased() 当用户释放滑块,发射此信号。
QDial是一个刻度表盘。