Qt基础与窗口部件详解:窗口、对话框、按钮与布局

分类: 365彩票是不是诈骗呢 时间: 2025-11-01 15:27:16 作者: admin 阅读: 397 点赞: 523
Qt基础与窗口部件详解:窗口、对话框、按钮与布局

类继承关系

第一节 基础窗口部件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"<

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是一个刻度表盘。

相关推荐

公羊皮鞋怎么样,公羊旗舰店,公羊皮鞋官方品牌正品专卖
365彩票是不是诈骗呢

公羊皮鞋怎么样,公羊旗舰店,公羊皮鞋官方品牌正品专卖

📅 10-08 👁️ 6991
.io是哪个国家的域名?.io域名详细信息 .io后缀域名
注册送365元可提款

.io是哪个国家的域名?.io域名详细信息 .io后缀域名

📅 08-10 👁️ 7858
拿了腾讯 5000万 美元投资之后,聊天软件 Kik 收购了一个时尚穿搭类 APP