2.QT窗口部件

news2024/11/15 11:15:27

类继承关系图

(上面为Base类,下面为Derived类)
在这里插入图片描述

窗口与子部件

窗口:没有父部件的部件,称为顶级部件
子部件:非窗口部件

新建空的qmake项目mywidget1

//mywidget1.pro

QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS

QT += widgets

SOURCES += \
    main.cpp
//main.cpp

#include<QTWidgets>
int main(int argc,char *argv[])
{
    QApplication a(argc,argv);

    QWidget *widget=new QWidget();
    widget->setWindowTitle(QObject::tr("I am widget"));

    QLabel *label=new QLabel();
    label->setWindowTitle(QObject::tr("I am label"));
    label->setText(QObject::tr("label:I am a window"));
    label->resize(350,20);

    QLabel *label2=new QLabel(widget);
    label2->setText(QObject::tr("label2:不是独立窗口,只是widget的子部件"));
    label2->resize(350,20);

    label->show();
    widget->show();
    int ret=a.exec();
    delete label;
    delete widget;
    return ret;
}

运行结果
在这里插入图片描述

窗口类型

窗口一般有边框和标题栏,但不必需

QWidget的构造函数有两个参数:QWidget *parent = 0 和 Qt::WindowFlags f = 0
其中,parent是父窗口部件,默认为0即没有父窗口
f是Qt::WindowType枚举类型,默认为0即Qt::Widget窗口类型

更改新建对象的两行:

    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);

label2(widget)窗口隐藏到后面,label窗口停留在所有窗口之上
在这里插入图片描述

窗口几何布局

帮助文档索引Window and Dialog Widgets

QWidget提供了几个处理小组件的几何形状的函数。其中一些函数在纯客户区域(即不包括窗口框架的窗口)上操作,另一些则包括窗口框架。这种区分是以一种透明地涵盖最常见的用法的方式进行的。
包括窗口框架:x(), y(), frameGeometry(), pos(), move()
不包括窗口框架:geometry(), width(), height(), rect(), size()
在这里插入图片描述

断点调试

//main.cpp

#include<QApplication>
#include<QWidget>

int main(int argc,char *argv[])
{
    QApplication a(argc,argv);
    QWidget widget;
    int x=widget.x();
    int y=widget.y();
    QRect geometry=widget.geometry();
    QRect frame=widget.frameGeometry();
    return a.exec();
}

直接debug无反应

使用qDebug()调试

//main.cpp

#include<QApplication>
#include<QWidget>
#include<QDebug>

int main(int argc,char *argv[])
{
    QApplication a(argc,argv);
    QWidget widget;
    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);
    QRect geometry=widget.geometry();
    QRect frame=widget.frameGeometry();
    qDebug()<<"geometry:"<<geometry<<"frame:"<<frame;
    qDebug()<<"pos:"<<widget.pos()<<endl<<"rect:"<<widget.rect()<<endl
    <<"size:"<<widget.size()<<endl<<"width:"<<widget.width()<<endl
    <<"height:"<<widget.height()<<endl;
    return a.exec();
}

运行结果:
在这里插入图片描述

对话框QDialog

模态和非模态对话框

模态对话框:关闭它之前,不能再与同一个应用程序的其他窗口交互,使用exec()
非模态对话框:既可以与它交互,也可以与同一程序的其他窗口交互,使用new和show()

新建项目mywidget1
在这里插入图片描述
在这里插入图片描述

//mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDialog>

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    QDialog dialog(this);
    dialog.show();
}

MyWidget::~MyWidget()
{
    delete ui;
}

运行结果:小的窗口一闪而过(dialog对象在构造函数执行结束后自动释放)

dialog创建两行改为:

    QDialog *dialog=new QDialog(this);
    dialog->show();

运行结果:一大一小 (大的是MyDialog窗口,小的是对话框)
在这里插入图片描述

不用指针,再将这两行改为:

    QDialog dialog(this);
    dialog.exec();

运行结果:只弹出小的,关闭后,弹出大的。称为模态对话框

多窗口切换

继续使用mydialog1项目

信号和槽

进入mywidget.ui,拖用Push Button和Label,Push Button的objectName改为showChildButton,文本改为“显示子窗口”,Label的文本改为“我是主页面”
在这里插入图片描述
在这里插入图片描述保存后在mywidget.h的MyWidget类最后添加:

public slots:
    void showChildDialog();

点击showChildDialog,按alt+enter,点击"在mywidget.cpp中添加定义"
在这里插入图片描述

//mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDialog>

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    connect(ui->showChildButton,&QPushButton::clicked,this,&MyWidget::showChildDialog);
}

MyWidget::~MyWidget()
{
    delete ui;
}

void MyWidget::showChildDialog()
{
    QDialog *dialog=new QDialog(this);
    dialog->show();
}

已经解决 no member named ‘showChildButton’ in ‘Ui::MyWidget’

connect行出现该报错,原因为未构建项目,点击左下角的“锤子”即可

运行结果:
在这里插入图片描述
点击“显示子窗口”:
在这里插入图片描述
关联信号和槽的connect函数的四个参数:
发射信号的对象、发射的信号、接收信号的对象,要执行的槽

自动关联

在mywidget.cpp中,将showChildDialog()槽命名为on_showChildButton_clicked(),即on_发射信号的对象_信号名
在这里插入图片描述
在这里插入图片描述
运行结果同上。自动关联方式在Qt设计器中更简便,但在其他设计器中还需要其他操作(书P53)

自定义对话框

继续使用项目mydialog1
新建MyDialog类
在这里插入图片描述
Debug without Buttons,类名MyDialog,设计模式中添加两个Push Button,文本为“进入主界面”和“退出程序”

点击第二个图标,进入信号和槽的编辑模式
在这里插入图片描述
在这里插入图片描述
关联如下,若要取消,可点击clicked()文字,文本框为红色时按delete,或右键
在这里插入图片描述
点击第一个图标,返回部件编辑模式
在这里插入图片描述
“进入主界面”右键,转到槽
在这里插入图片描述
选择clicked()
在这里插入图片描述
点击OK后跳转到mydialog.cpp代码

//mydialog.cpp的改动部分

void MyDialog::on_pushButton_clicked()
{
    accept();
    //对于一个使用exec()实现的模态对话框,执行该槽会隐藏模态对话框
    //并返回QDialog::Accepted值,可用于判断哪个按钮被按下
    //类似还有reject()槽,返回QDialog::Rejected值,可以关联“退出程序”
}

//main.cpp

#include "mywidget.h"
#include <QApplication>
#include"mydialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    MyDialog dialog;
    //若按下“进入主界面”,则显示主界面,否则退出程序
    if(dialog.exec()==QDialog::Accepted){
        w.show();
        return a.exec();
    }
    else return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进入mywidget.ui,再添加两个Push Button,“退出”同样“牵红线”关联close,“重新登陆”同样转到槽
在这里插入图片描述

//mywidget.cpp改动部分
//添加头文件,否则MyDialog不识别!!!
#include"mydialog.h"

//代码正文...

void MyWidget::on_pushButton_clicked()
{
    //先隐藏主界面
    close();
    //若按下“进入主界面”,则再次显示主界面,否则退出
    MyDialog dlg;
    if(dlg.exec()==QDialog::Accepted) show();
}

运行结果:
在这里插入图片描述
在这里插入图片描述
点击“重新登录”后,回到Dialog页面,无限循环

标准对话框(末尾附8button完整代码)

新建Qt Widget项目mydialog2
在这里插入图片描述
mywidget.ui拖入Push Button,修改文本如下:
Tips:书中的顺序是按行拖用,即1是颜色,2是文件…但本博客是按列拖用,唯一的影响是槽的编号
在这里插入图片描述
显示不全的button框(比如“错误信息对话框”),可以修改宽度
在这里插入图片描述

颜色对话框

在.ui界面右键button,转到槽

//mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDebug>
#include<QColorDialog>

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
}

MyWidget::~MyWidget()
{
    delete ui;
}


void MyWidget::on_pushButton_clicked()
{
    //getColor的3个参数:设置初始颜色、指定父窗口、设置对话框标题
    QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"));
    qDebug()<<"color:"<<color;
}

已经解决报错“常量中有换行符”

在这里插入图片描述
对应行改为:

    QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色"));
    //建议直接用英语

在这里插入图片描述

在这里插入图片描述

color: QColor(ARGB 1, 0, 1, 0.498039)
4个值代表:透明度(alpha)、R、G、B
其中透明度为1则完全不透明,0.498039为127/255

添加对透明度的设置:
对应行代码改为

    QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色"),QColorDialog::ShowAlphaChannel);

运行结果:
在这里插入图片描述
在这里插入图片描述

color: QColor(ARGB 0.392157, 0, 1, 0.498039)
0.392157=100/255

前面是静态函数方法,不用创建对象
更灵活的方式:先创建对象,再设置各项,结果相同

//mywidget.cpp改动部分

void MyWidget::on_pushButton_clicked()
{
    QColorDialog dialog(Qt::red,this);
    dialog.setOption(QColorDialog::ShowAlphaChannel);
    dialog.exec();
    QColor color=dialog.currentColor();
    qDebug()<<"color:"<<color;
}

文件对话框

在.ui界面右键button,转到槽

//mywidget.cpp改动部分

#include<QFileDialog>

//代码正文

void MyWidget::on_pushButton_5_clicked()
{
    //4个参数:指定父窗口、设置对话框标题、指定默认打开路径、设置文件类型过滤器
    QString filename=QFileDialog::getOpenFileName(this,tr("文件"),"D:",tr("图片文件(*png *jpg)"));
    qDebug()<<"filename:"<<filename;
}

运行后,出现8个button,点击“文件对话框”后,选一张图片打开后,qDebug输出图片路径

在这里插入图片描述

我的图片路径为 filename: “D:/wj.png”

改动一行代码,添加文件类型:

    QString filename=QFileDialog::getOpenFileName(this,tr("文件"),"D:",tr("图片文件(*png *jpg);;文本文件(*txt)"));

运行结果:
在这里插入图片描述
在这里插入图片描述

再改动这行代码,同时选择多个文件:

 QStringList filenames=QFileDialog::getOpenFileNames(this,tr("文件"),"D:",tr("图片文件(*png *jpg)"));

运行结果:
在这里插入图片描述

字体对话框

在.ui界面右键button,转到槽

//mywidget.cpp改动部分

#include<QFontDialog>

void MyWidget::on_pushButton_2_clicked()
{
    bool ok;
    QFont font=QFontDialog::getFont(&ok,this);
    if(ok) ui->pushButton_2->setFont(font);
    else qDebug()<<tr("未选择");
    //同理,这里中文字数太多也会报错“常量中有换行符”
}

运行结果:
在这里插入图片描述
“字体对话框”字号变小
在这里插入图片描述

不选择字体,直接cancel:
在这里插入图片描述

输入对话框

在.ui界面右键button,转到槽

//mywidget.cpp改动部分

#include<QInputDialog>

void MyWidget::on_pushButton_6_clicked()
{
    bool ok;
    //getText()的参数:指定父窗口、设置窗口标题、设置标签显示文本、字符串的显示模式、默认输入字符串、按下按钮信息的bool变量
    QString string=QInputDialog::getText(this,tr("stringDialog"),tr("userName"),QLineEdit::Normal,tr("admin"),&ok);
    if(ok) qDebug()<<"string:"<<string;

    //用箭头调整大小时,每次变化10
    int value1=QInputDialog::getInt(this,tr("intDialog"),tr("-1000~1000"),100,-1000,1000,10,&ok);
    if(ok) qDebug()<<"value1:"<<value1;

    //小数的位数是2
    double value2=QInputDialog::getDouble(this,tr("doubleDialog"),tr("-1000~1000"),0.00,-1000,1000,2,&ok);
    if(ok) qDebug()<<"value2:"<<value2;

    QStringList items;
    items<<tr("item1")<<tr("item2");
    //true是设置条目可以被更改
    QString item=QInputDialog::getItem(this,tr("item"),tr("chooseOrInput"),items,0,true,&ok);
    if(ok) qDebug()<<"item:"<<item;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

消息对话框

在.ui界面右键button,转到槽
Tips:运行时提示音不同,由操作系统设置

//mywidget.cpp改动部分

#include<QMessageBox>

void MyWidget::on_pushButton_3_clicked()
{
    int ret1=QMessageBox::question(this,tr("questionDialog"),tr("Do you know Qt?"),QMessageBox::Yes,QMessageBox::No);
    if(ret1==QMessageBox::Yes) qDebug()<<tr("Question!");

    int ret2=QMessageBox::information(this,tr("informationDialog"),tr("Qt book."),QMessageBox::Ok);
    if(ret2==QMessageBox::Ok) qDebug()<<tr("Information!");

    int ret3=QMessageBox::warning(this,tr("warningDialog"),tr("cannot stop in advance!"),QMessageBox::Abort);
    if(ret3==QMessageBox::Abort) qDebug()<<tr("Warning!");

    int ret4=QMessageBox::critical(this,tr("criticalDialog"),tr("Error!Close all!"),QMessageBox::YesAll);
    if(ret4==QMessageBox::YesAll) qDebug()<<tr("Error!");

    QMessageBox::about(this,tr("aboutDialog"),tr("Welcome!"));
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

进度对话框

在.ui界面右键button,转到槽

//mywidget.cpp改动部分

#include<QProgressDialog>

void MyWidget::on_pushButton_7_clicked()
{
    //参数:对话框标签内容、取消按钮的显示文本、最小值、最大值、父窗口
    QProgressDialog dialog(tr("copyProgress"),tr("cancel"),0,50000,this);
    dialog.setWindowTitle(tr("progressDialog"));
    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);
    qDebug()<<tr("Completed!");
}

在这里插入图片描述
在这里插入图片描述

错误信息对话框

//本段是有问题的示例代码,解决见下文
//mywidget.h添加类前置声明和私有对象

class QErrorMessage;
QErrorMessage *errordlg;
//mywidget.cpp改动部分

#include<QErrorMessage>

//构造函数
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    // 初始化 errordlg 对象
    errordlg=new QErrorMessage(this);
}

//析构函数
MyWidget::~MyWidget()
{
    delete ui;
    // 清理 errordlg 对象
    delete errordlg;
}


//在.ui界面右键button,转到槽

void MyWidget::on_pushButton_4_clicked()
{
    errordlg->setWindowTitle(tr("errormessageDialog"));
    errordlg->showMessage(tr("errorMessage!"));
}

已经解决:报错“重复定义”

在这里插入图片描述

//mywidget.h添加类前置声明和私有对象

// 前置声明 QErrorMessage 类
class QErrorMessage;

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MyWidget(QWidget *parent = nullptr);
    ~MyWidget();

private slots:
	//若干个槽,此处省略
    void on_pushButton_clicked();

private:
    Ui::MyWidget *ui;
    // 在这里添加私有对象指针!!!
    QErrorMessage *errordlg;
};

运行结果:
在这里插入图片描述
默认有一个’Show this message again’复选框,勾选后点击OK返回8个button界面,再次点击“错误信息对话框”,仍会弹出这个框;取消勾选后,点击“错误信息对话框”无反应

向导对话框

//mywidget.h

#include<QWizard>

private:
    Ui::MyWidget *ui;
    QWizardPage *createPage1();
    QWizardPage *createPage2();
    QWizardPage *createPage3();
//mywidget.cpp改动部分

QWizardPage * MyWidget::createPage1()
{
    QWizardPage *page=new QWizardPage;
    page->setTitle(tr("Introduction"));
    return page;
}

QWizardPage * MyWidget::createPage2()
{
    QWizardPage *page=new QWizardPage;
    page->setTitle(tr("Choose"));
    return page;
}

QWizardPage * MyWidget::createPage3()
{
    QWizardPage *page=new QWizardPage;
    page->setTitle(tr("Result"));
    return page;
}

//在.ui界面右键button,转到槽

void MyWidget::on_pushButton_8_clicked()
{
    QWizard wizard(this);
    wizard.setWindowTitle(tr("guideDialog"));
    wizard.addPage(createPage1());
    wizard.addPage(createPage2());
    wizard.addPage(createPage3());
    wizard.exec();
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其他窗口部件

QFrame类族

QFrame是带边框的部件的基类,主要通过边框形状和阴影的组合,实现边框效果
帮助文档的效果图:
在这里插入图片描述
其中,lineWidth是边框边界线的宽度,midLineWidth是在边框额外插入的线的宽度(为了形成3D效果)
书中的表格:
在这里插入图片描述
在这里插入图片描述

QLabel

新建Qt Widget项目myframe,选择基类QWidget,类名MyWidget
打开mywidget.ui,拖用Frame,右下角属性栏更改如下:
在这里插入图片描述
此时Frame如图:
在这里插入图片描述
等效的方式:

//mywisget构造函数内部

    ui->frame->setFrameShape(QFrame::Box);
    ui->frame->setFrameShadow(QFrame::Sunken);
    ui->frame->setLineWidth(5);
    ui->frame->setMidLineWidth(10);

拖用Label,将其拖大些,右下角属性栏更改如下:
在这里插入图片描述
此时界面如图:
在这里插入图片描述

//mywisget构造函数内部添加

    QFont font;
    font.setFamily("华文行楷");
    font.setPointSize(20);
    font.setBold(true);
    font.setItalic(true);
    ui->label->setFont(font);

    QString string =tr("too long,need omitting");
    //elidedText()的参数:要省略的文本、省略号出现的位置、文本的长度(单位是像素)
    QString str=ui->label->fontMetrics().elidedText(string,Qt::ElideRight,200);
    ui->label->setText(str);

运行结果:
在这里插入图片描述
再添加一行:

    ui->label->setPixmap(QPixmap("D:/wj.png"));

运行结果:图片覆盖原来的文本
在这里插入图片描述

QLCDNumber(液晶数字)

.ui界面拖用LCDNumber,右下角属性栏改为:
在这里插入图片描述
构建后运行,多了一个液晶显示屏如下:
在这里插入图片描述

QtackedWidget(部件栈)

.ui拖用List Wisget,右键选择“编辑项目”,左下角“绿色加号”添加如下:
在这里插入图片描述
拖用Stacked Widget,再拖用Label到Stacked Widget里面,编辑文本为firstPage,点击Stacked Widget右上角箭头,再拖用Label到里面,编辑文本为secondPage(若结果对应关系相反,见下文)
在这里插入图片描述
右下角更改Stacked Widget属性栏如下:

在这里插入图片描述
在“编辑信号与槽”模式牵红线,更改如下:
在这里插入图片描述

已经解决:运行结果对应关系相反

Stacked Widget具有栈的特性,编辑Label时,先写secondPage,再写firstPage

运行结果:
在这里插入图片描述
在这里插入图片描述

QToolBox(层叠窗口抽屉)

.ui拖用Tool Box,右键选择“插入页”,每个页的右下角属性栏更改如下:
frameShape为Box;currentItemText分别为“好友”、“黑名单”、“陌生人”
在这里插入图片描述
运行结果:
在这里插入图片描述

按钮部件

QPushButton

新建Qt Widget项目mybutton,选择基类QWidget,类名MyWidget

.ui拖用3个Push Button,右下角属性栏更改如图,数字分别为1,2,3
在这里插入图片描述
继续更改属性栏:Button1的checkable勾选,Button2的flat勾选
其中checkable属性具有两个状态:选择or未选中;flat属性按钮不显示边框

Button1转到槽,选择toggled(bool)如下:
在这里插入图片描述

//mywidget.cpp添加如下:
#include<QDebug>

void MyWidget::on_pushButton_1_toggled(bool checked)
{
    qDebug()<<tr("Push or not:")<<checked;
}

运行时,按下Button1,会显示:“Push or not:” true,但再按一下会显示:“Push or not:” false,无限循环

//mywidget.cpp继续在构造函数中添加如下:

#include<QMenu>

    ui->pushButton_1->setText(tr("&nihao"));
    ui->pushButton_2->setText(tr("help(&H)"));
    ui->pushButton_2->setIcon(QIcon("D:/wx.png"));
    ui->pushButton_3->setText(tr("z&oom"));
    QMenu *menu=new QMenu(this);
    menu->addAction(QIcon("D:/txqq.png"),tr("Enlarge"));
    ui->pushButton_3->setMenu(menu);

其中字母前加“&”符号,可以设置按下该按钮的快捷键为alt+该字母,如案例中分别为alt+n、alt+h、alt+o
运行结果:
在这里插入图片描述

QGroupBox、QCheckBox、QRadioButton

.ui拖用两个Group Box,文本改为“复选框”、“单选框”
“复选框”中拖入3个Check Box,文本改为“跑步”、“踢球”、“游泳”;“游泳”的右下角属性栏tristate勾选
tristate勾选后,具有3个状态:“不改变”、“选中”、“未选中”
“单选框”中拖入3个Radio Button,文本改为“优秀”、“一般”、“不好”
运行结果:
在这里插入图片描述

QLineEdit

新建Qt Widget项目mylineedit,选择基类QWidget,类名MyWidget

.ui拖用4个Label和Line Edit如图,右下角属性栏Line Edit的objectName为lineEdit_1、2、3、4
在这里插入图片描述

显式模式

lineEdit_1继续更改属性的显示模式为Password,其中Normal为显式文本显示、NoEcho为不显示文本、Password显示为小黑点/星号、PasswordRchoOnEdit在编辑时为显式,其他情况为密码模式
在这里插入图片描述
运行结果:
在这里插入图片描述

输入掩码

lineEdit_2的属性inputMask中编辑如下:

AA-90-bb! aa#H;*

书中掩码字符表:
在这里插入图片描述
转到returnPressed()槽

//mywidget.cpp添加部分

#include<QDebug>

void MyWidget::on_lineEdit_2_returnPressed()
{
    ui->lineEdit_3->setFocus();
    qDebug()<<ui->lineEdit_2->text();
    qDebug()<<ui->lineEdit_2->displayText();
}

运行结果:
在这里插入图片描述

qDebug()输出:
“DD-10-01 dd#d”
“DD-10-01 dd#d”

输入验证

//mywidget.cpp构造函数添加部分

#include<QIntValidator>

    //添加验证器,只能输入100~999
    QValidator *validator=new QIntValidator(100,999,this);
    ui->lineEdit_3->setValidator(validator);

运行结果:
在这里插入图片描述
若输入大于999,则只取前3位;若输入小于100,则qDebug()不显示;只有100~999之间正常

自动补全

//mywidget.cpp构造函数添加部分

#include<QCompleter>

    QStringList wordList;
    wordList<<"Qt"<<"Qt Creator"<<tr("hello");
    QCompleter *completer=new QCompleter(wordList,this);
    completer->setCaseSensitivity(Qt::CaseInsensitive);
    ui->lineEdit_4->setCompleter(completer);

运行结果:输入Q,自动提示补全
在这里插入图片描述

QAbstractSpinBox

新建Qt Widget项目myspinbox,选择基类QWidget,类名MyWidget

.ui拖用Time Edit、Date Edit、Date/Time Edit
Time Edit 的 displayFormat属性改为如下,即12小时制
Date Edit 勾选 calendarPopup,即使用弹出的日历设置日期

hh:mm:ssA

//mywidget.cpp构造函数添加部分

    ui->dateTimeEdit->setDateTime(QDateTime::currentDateTime());
    ui->dateTimeEdit->setDisplayFormat(tr("yyyy.MM.dd.ddd HH:mm:ss"));

运行结果:
在这里插入图片描述

QSpinBox、QDoublrSpinBox

.ui拖用Spin Box和Double Spin Box
属性栏,前缀prefix可以是¥,后缀suffix可以是%,decimals是小数点后的位数

运行结果:
在这里插入图片描述

QAbstractSlider

新建Qt Widget项目myslider,选择基类QWidget,类名MyWidget
拖用刻度表盘Dial(中圆)、Horizontal Scroll Bar(左)、Vertical Scroll Bar(上)、Horizontal Slider(右)、Vertical Slider(下)、Spin Box(左下)
Dial属性栏最下面的wrapping勾选为首尾相连,notchesVisible勾选为显式刻度
牵红线Dial的sliderMoved(int)与其他5个部件的setValue(int)
在这里插入图片描述
运行结果:转动中间的刻度表盘Dial,其他部件都随之变化
在这里插入图片描述

本篇所有项目的代码压缩包

链接:本篇所有项目的代码压缩包
提取码:ldwo

参考书目

链接:Qt Creator快速入门第三版
提取码:3ryu

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/464808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这是一个黑科技:C++爬虫~(文末报名C/C++领域新星计划)

目录 写在前面 完整代码 这里必看&#xff01;&#xff01; 写在最后 写在前面 现在所有人都知道万能的Python可以做机器学习&#xff0c;可以做人工智能&#xff0c;可以爬取各种小网站&#xff0c;但是你不知道&#xff0c;基于C的正则表达式早就能够爬取各种网络数据啦&a…

华为OD机试——对称美学(通过率只有8.51%???)

用java写的这道题&#xff0c;两个样例都可以通过&#xff0c;但是提交之后最终的通过率只有8.51%&#xff1f;&#xff1f;&#xff1f;自己搞了半天一直都是这个通过率&#xff0c;然后用网上说的100%通过率的代码也是一样的结果&#xff0c;最后时间到了还是没有拿到满分&am…

这些vue基本语法,你掌握了吗

文章目录 一、 vue 项目重点概念介绍1. 单页面应用程序2. 单文件组件3.数据驱动视图 二、 vue 基本结构1、template2、script3、style 三、 vue 常用指令介绍1、内容渲染指令&#xff08;1&#xff09;插值表达式 {{xxx}} —常用方式&#xff08;2&#xff09;v-text&#xff0…

session和JWT的应用及区别

文章目录 登录认证(node)一、session1.下载session2.全部配置session3.存储session4.获取session5.销毁session 二、JWT (Json web token)1.JWT 的工作原理2.JWT 的组成3.下载JWT4.生成token5.解密TOken6.配置全局错误中间件 登录认证(node) 一、session 一、在node中使用sess…

还不懂Redis?看完这个故事就明白了!

还不懂Redis?看完这个故事就明白了! 我是Redis 你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上。 说起我的诞生,跟关系数据库MySQL还挺有渊源的。 在我还没来到这个世界上的时候,MySQL过的很辛苦,互联网发展的越来越快,它容纳的数据也越来越多,用户请求也…

全国独家专利药品有哪些品种?全国独家药品产品汇总查阅

独家药品一般是指某一家药企拥有生产和销售某种药品的独家权利&#xff0c;细分有活性成分独家&#xff08;通用名成分独家&#xff09;、品种独家&#xff08;同成分不同剂型&#xff09;、独家品规&#xff0c;通俗可以分成药品功能独家和产品独家。独家药品经常被人认为是具…

证件拍照扫描——基于C++与深度神经网络实现证件识别扫描并1比1还原证件到A4纸上

前言 数字化时代的到来&#xff0c;越来越多的证件需要进行电子化处理&#xff0c;例如身份证、驾驶证、护照等。在进行电子化处理时&#xff0c;最常见的需求就是将证件照片复制到A4纸上&#xff0c;以便于打印、存档或传输。同时&#xff0c;为了方便信息的录入和管理&#…

一条命令搭建HTTP服务器

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章&#xff1a;【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…

word自带公式编辑

快捷键&#xff1a; 公式编辑&#xff1a;alt“” 上标&#xff1a;x^i 空格 下标&#xff1a;x_i 空格 实数R&#xff1a;\doubleR 空格 偏微分算子&#xff1a;“\partial” 极限&#xff1a;“\limit”&#xff08;按空格后会显示一串很长的式子&#xff0c;再空格就变…

在Linux操作系统上部署wgcloud监控

1.wgcloud监控介绍 1.1 介绍 ​ 这是一款开源的主机监控系统&#xff0c;可以支持主机各种指标监测&#xff08;cpu使用率&#xff0c;cpu温度&#xff0c;内存使用率&#xff0c;磁盘容量空间&#xff0c;磁盘IO&#xff0c;硬盘SMART健康状态&#xff0c;系统负载&#xff…

starrocks基于prometheus实现监控告警

监控报警 本文介绍如何为 StarRocks 设置监控报警。 StarRocks 提供两种监控报警的方案。企业版用户可以使用内置的 StarRocksManager&#xff0c;其自带的 Agent 从各个 Host 采集监控信息&#xff0c;上报至 Center Service&#xff0c;然后做可视化展示。StarRocksManager …

[陇剑杯 2021]之Misc篇(NSSCTF)刷题记录⑤

NSSCTF-Misc篇-[陇剑杯 2021] 日志分析:[陇剑杯 2021]日志分析&#xff08;问1&#xff09;[陇剑杯 2021]日志分析&#xff08;问2&#xff09;[陇剑杯 2021]日志分析&#xff08;问3&#xff09; 简单日志分析&#xff1a;[陇剑杯 2021]简单日志分析&#xff08;问1&#xff0…

Python制作一个自动发送弹幕的工具,让你看直播不冷场

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 让我们先看看效果&#xff1a; 名字我就打码了&#xff0c;当然名字不是关键&#xff0c;我直接截图展示算了&#xff0c;GIF的话&#xff0c;太麻烦了。 环境使用: Python 3.8 / 编译器 Pycharm 2021.2版本 / 编辑器…

存在列排斥力的另一例证

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由5张二值化的图片组成&#xff0c;让A中有5个1&#xff0c;B中全是0&#xff0c;排列组合A的所有可能&#xff0c;统计迭代次数的顺序。其中有12组数据 A-B 迭代次数 1 0 1 5*4*2*1…

Inception 深度卷积神经网络(CNN)架构

Inception是一种深度卷积神经网络&#xff08;CNN&#xff09;架构&#xff0c;由Google在2014年提出。它是一种基于多尺度卷积的网络结构&#xff0c;旨在解决传统CNN在处理不同大小的输入图像时存在的问题。 Inception的主要特点是使用了多个不同尺度的卷积核来提取不同尺度…

API测试| 了解API接口测试| API接口测试指南(一)

什么是API&#xff1f; API是一个缩写&#xff0c;它代表了一个 pplication P AGC软件覆盖整个房间。API是用于构建软件应用程序的一组例程&#xff0c;协议和工具。API指定一个软件程序应如何与其他软件程序进行交互。 例行程序&#xff1a;执行特定任务的程序。例程也称为过…

人脸检测和行人检测2:YOLOv5实现人脸检测和行人检测(含数据集和训练代码)

人脸检测和行人检测2&#xff1a;YOLOv5实现人脸检测和行人检测(含数据集和训练代码) 目录 人脸检测和行人检测2&#xff1a;YOLOv5实现人脸检测和行人检测(含数据集和训练代码) 1. 前言 2. 人脸检测和行人检测数据集说明 &#xff08;1&#xff09;人脸检测和行人检测数据…

初识C++之左值引用与右值引用

目录 一、左值引用与右值引用 1. 左值和右值的概念 1.1 左值 1.2 右值 1.3 左值与右值的区分 2. 左值引用与右值引用 2.1 左值引用与右值引用的使用方法 2.2 左值引用的可引用范围 2.3 右值引用的可引用范围 3. 右值引用的作用 3.1 减少传值返回的拷贝 3.2 插入时的…

2023北京新一代信息技术应用融合创新人才发展峰会暨鲲鹏开发者创享日·北京站成功举办

以技术创新促产业发展&#xff0c;以开放使能筑人才根基 4月25日&#xff0c;由北京市经济和信息化局、北京市朝阳区人民政府、国家工业信息安全发展研究中心与华为技术有限公司联合主办&#xff0c;北京鲲鹏联合创新中心、北京市中小企业公共服务平台、中国软件行业协会承办的…

字节超全学习流程图流出,100天涨薪10k,从功能测试到自动化测试

今年年初&#xff0c;由于经济压力让我下定决心进阶自动化测试&#xff0c;已经24的我做了3年功能测试&#xff0c;坐标广州薪资定格在8k&#xff0c;可能是生活过的太安逸&#xff0c;觉得8000的工资也够了。 但是生活总是多变的&#xff0c;女朋友的突然怀孕&#xff0c;让我…