当前位置:   article > 正文

Qt:第三章:常用控件介绍_qt中qwidget控件介绍

qt中qwidget控件介绍

一、窗口控件

1、窗口创建

窗口分为三种:普通窗口、无边框窗口以及顶层窗口(顶层窗口永远在最上面)

  1. //普通窗口
  2. QWidget *widget = new QWidget(nullptr,Qt::Tool|Qt::WindowCloseButtonHint|Qt::WindowMaximizeButtonHint);
  3. widget->setWindowTitle(QStringLiteral("widget窗口"));
  4. widget->show();
  5. //无边框
  6. QWidget *widget1 = new QWidget(nullptr, Qt::FramelessWindowHint);
  7. widget1->show();
  8. //作为顶层窗口出现
  9. QWidget *widget2 = new QWidget(nullptr,Qt::Dialog| Qt::WindowStaysOnTopHint);
  10. widget2->setWindowTitle("top widget");
  11. widget2->show();

2、对话框

1、模态对话框和非模态对话框

  • 模态对话框:就是我们没有关闭它之前,不能再与同一个应用程序中的其他窗口进行交互(操作),例如vs中的新建项目窗口,若不关闭,无法进行编写代码的操作。要想使一个窗口为模态窗口,需要调用它的exec()方法显示窗口。

  • 非模态对话框:关闭该对话框之前,还可以与应用程序中的其他窗口进行交互(操作),例如记事本中的查找窗口要想使一个窗口为非模块窗口的话,需要使用new操作符在堆上创建窗口对象,使用show()方法进行显示

  1. //模态对话框
  2. void Dialog04::on_modalButton_clicked()
  3. {
  4. QDialog dlg(this);
  5. dlg.resize(200, 200);
  6. dlg.exec();
  7. }
  8. //非模态对话框
  9. void Dialog04::on_noModalButton_clicked()
  10. {
  11. QDialog dlg1(this);
  12. dlg1.resize(200, 200);
  13. dlg1.show();
  14. }

2、消息对话框

MessageBox:有信息提示框、警告提示框、错误提示框、问题提示框、关于提示框

  1. //信息提示框
  2. QMessageBox::information(nullptr, QStringLiteral("提示信息"), QStringLiteral("这是信息提示窗口"), QMessageBox::Yes | QMessageBox::No);
  3. //警告提示框
  4. QMessageBox::warning(nullptr, QStringLiteral("警告信息"), QStringLiteral("程序警告信息"));
  5. //错误提示框
  6. QMessageBox::critical(nullptr, QStringLiteral("错误信息"), QStringLiteral("程序发生致命错误"));
  7. //问题提示框
  8. QMessageBox::question(nullptr, QStringLiteral("问题信息"), QStringLiteral("你是否关闭问题窗口"),QMessageBox::Yes | QMessageBox::No);
  9. //关于提示框
  10. QMessageBox::about(nullptr, QStringLiteral("关于"), QStringLiteral("关于应用程序"));//自定义
  11. QMessageBox::aboutQt(nullptr);//显示Qt文档

 显示图标分别为:

 3、文件对话框

QFileDialog :用于文件的读写

3.1、读文件

方式一:普通方法进行文件读取

  1. //参数1:父对象 参数2:窗口标题 参数3:指定默认打开路径 参数4:过滤器(过滤文件类型)
  2. QString strFileName = QFileDialog::getOpenFileName(this, QStringLiteral("打开文件对话框"), "D:\\",QStringLiteral("文本文件(*txt);;源文件(*cpp)"));
  3. //创建读写文件对象
  4. QFile file(strFileName);
  5. //以指定方式打开文件
  6. file.open(QIODevice::ReadOnly | QIODevice::Text);
  7. //读取文件所有内容
  8. QByteArray content = file.readAll();
  9. //信息框展示文件内容
  10. QMessageBox::information(nullptr, QStringLiteral("读取文件"), QString(content));
  11. //关闭
  12. file.close();

方式二:使用QTextStream流方法

  1. //参数1:父对象 参数2:窗口标题 参数3:指定默认打开路径 参数4:过滤器(过滤文件类型)
  2. QString strFileName = QFileDialog::getOpenFileName(this, QStringLiteral("打开文件对话框"), "D:\\",QStringLiteral("文本文件(*txt);;源文件(*cpp)"));
  3. //创建读写文件对象
  4. QTextStream stream(&file);
  5. //以指定方式打开文件
  6. file.open(QIODevice::ReadOnly | QIODevice::Text);
  7. //读取文件内容
  8. stream.read(1);//读取一个字符、
  9. //stream.seek(0);//移动光标到最开始
  10. //stream.readLine();//读取一行字符
  11. //stream.readAll();//读取全部字符
  12. //使用流将读取数据写入string
  13. QString string;
  14. stream >> string;
  15. //信息框展示文件内容
  16. QMessageBox::information(nullptr, QStringLiteral("读取文件"), string);
  17. //关闭
  18. file.close();
3.2、写文件
  1. //选择文件,用strFileName接收文件路径
  2. QString strFileName = QFileDialog::getSaveFileName(this, QStringLiteral("保存文件对话框"), "D:\\",
  3. QStringLiteral("文本文件(*.txt);;源文件(*.cpp)"));
  4. if (!strFileName.isEmpty()) {
  5. QFile file(strFileName);
  6. if (file.open(QIODevice::WriteOnly)) {
  7. QTextStream stream(&file);
  8. stream << "123456";//写入文件
  9. file.close();//关闭文件
  10. }
  11. else {
  12. //文件路径为空时的处理
  13. //qDebug() << "无法打开文件:" << strFileName;
  14. }
  15. }

4、颜色对话框

QClolrDialog:使用Qt内置的颜色选择器

  1. //参数1:颜色窗口打开时默认选择的颜色,参数2:父对象,参数3:窗口标题 参数4:透明度调整
  2. //方式1
  3. QColor color = QColorDialog::getColor(Qt::red, this, QStringLiteral("选择颜色"),QColorDialog::ShowAlphaChannel);
  4. qDebug() << color;
  5. //打开颜色对话框方式2
  6. QColorDialog dialog(Qt::green, this);//创建颜色对话框
  7. dialog.exec();//显示颜色对话框
  8. QColor color = dialog.currentColor();//获取用户当前选择的颜色
  9. qDebug() << color;

5、进度对话框

QProgressDialog:慢动作进度反馈

Qt有提供写好的进度条:progressBar 

  1. //进度对话框 参数1:进度条上的文本信息 参数二:取消按钮的文本 参数3:起始值 参数4:结束值 参数5:父对象
  2. QProgressDialog dialog(QStringLiteral("文件复制进度"), QStringLiteral("取消"), 0, 1000, this);
  3. //调整窗口尺寸
  4. dialog.resize(300, 40);
  5. //以下两句代码用于设置窗口为模态窗口,级别比exec()要低
  6. dialog.setWindowModality(Qt::WindowModal);
  7. dialog.show();
  8. //进度条的进度变化
  9. for (int i=0;i<= 1000;i++)
  10. {
  11. Sleep(5);
  12. //设置进度条上的文本变化值
  13. dialog.setValue(i);
  14. }

3、QMainWindow主窗口

1、菜单栏

菜单栏:QMenuBar,菜单栏最多只能有一个,可以没有

菜单:QMenu:添加到菜单栏上的部件

菜单项:QAction:添加到菜单上的部件

  1. //创建菜单栏
  2. QMenuBar * bar = menuBar();
  3. //创建菜单
  4. QMenu *fileMenu = new QMenu(QStringLiteral("文件"));
  5. //把文件和编辑菜单添加到编辑栏上
  6. bar->addMenu(fileMenu);//方式一:先创建再添加
  7. bar->addMenu(QStringLiteral("编辑"));//直接添加
  8. //创建菜单项
  9. QAction *newAction = new QAction(QStringLiteral("新建"));
  10. //将菜单项添加到菜单上
  11. fileMenu->addAction(newAction);
  12. //添加一条分割线
  13. fileMenu->addSeparator();
  14. fileMenu->addAction(QStringLiteral("打开"));
  15. //将菜单栏添加到窗口menu
  16. this->setMenuBar(bar);
  17. //绑定操作信号
  18. connect(newAction, &QAction::triggered, this, &MainWindow05::myNewActionSlots);

2、工具栏

QToolBa:可以设置是否浮动、是否移动及添加带图标按钮等

  1. //创建
  2. QToolBar *toolBar = new QToolBar(this);
  3. //添加到此窗口最上面
  4. this->addToolBar(Qt::TopToolBarArea, toolBar);
  5. //设置工具栏是否可浮动 false--不可浮动
  6. toolBar->setFloatable(true);
  7. //设置工具栏是否可移动
  8. toolBar->setMovable(true);
  9. //添加按钮
  10. QPushButton *btn = new QPushButton(QStringLiteral("新建"),this);
  11. toolBar->addWidget(btn);
  12. //添加两个action到工具栏上
  13. toolBar->addAction(findAction);
  14. toolBar->addAction(newAction);
  15. //添加分隔符
  16. toolBar->addSeparator();
  17. //工具栏ToolBar上添加QToolButton按钮
  18. //新建toolButton按钮
  19. QToolButton *toolButton = new QToolButton();
  20. toolButton->setIcon(QIcon(":/MainWindow05/image/56.png"));//设置图标地址
  21. toolButton->setText(QStringLiteral("帮助"));//设置图标名称
  22. toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);//设置图标格式:图标在文字上方
  23. //添加到菜单栏
  24. toolBar->addWidget(toolButton);

3、状态栏

  1. //创建空的状态栏
  2. QStatusBar *statusBar = this->statusBar();
  3. ///将标签控件添加到状态栏
  4. QLabel *label = new QLabel(QStringLiteral("状态信息1"));
  5. statusBar->addWidget(label);
  6. //将按钮控件添加到状态栏
  7. QPushButton *btn1 = new QPushButton(QStringLiteral("状态栏按钮"), this);
  8. statusBar->addWidget(btn1);
  9. //将label2添加到状态栏最右侧
  10. QLabel *label2 = new QLabel(QStringLiteral("状态信息2"));
  11. statusBar->addPermanentWidget(label2);

4、可停靠区域控间

  1. QDockWidget *dockWidget = new QDockWidget(QStringLiteral("停靠窗口1"));
  2. //QMainWindow中addDockWidget()添加停靠窗口到指定位置
  3. this->addDockWidget(Qt::BottomDockWidgetArea,dockWidget);

 二、基础控件

1、按钮类控件

  • QPushButton(普通按钮):可以添加图标,还可以添加菜单及菜单项

  • QToolButton(工具按钮):主要用于QMainWindow的QToolBar中,可以设置图片和文本的相对位置,也可以只显示图标或文本

  • QRadioButton(单选按钮):主要用于从一组按钮中选择其中的某一个

  • QCheckBox(复选框):可以同时选择多项

  • QButtonGroup(按钮组):当有一组按钮可以共用一个槽函数时,可以再该槽函数中左判断逻辑,那么可以使用按钮组控件管理一组按钮。QPushButton、QToolButton、QRadioButton、QCheckBox都可以放到按钮组中管理

    • 常用方法:

      • addButton()

      • button()

      • setExclusive()

      • buttonClicked()信号

  1. ui.closeButton->setIcon(QIcon(":/ButtonsWidget06/image/1.png"));
  2. //新建菜单
  3. QMenu * menu = new QMenu(this);
  4. //添加菜单项,(图标、文本、同时指定QAction的triggered信号对应的槽函数)
  5. menu->addAction(QIcon(":/ButtonsWidget06/image/2.png"), QStringLiteral("关闭文件"), this, SLOT(closeFileSlot()));
  6. ui.closeButton->setMenu(menu);
  7. //设置两个单选按钮都不选中
  8. //Checkable和Checked需要同时使用
  9. ui.femaleButton->setCheckable(false);
  10. ui.femaleButton->setChecked(false);
  11. //禁止按钮,置灰,无法操作
  12. ui.femaleButton->setDisabled(false);
  13. //复选框开启三态
  14. //ui.paintCheckBox->setTristate(true);
  15. //connect(ui.paintCheckBox,&QCheckBox::stateChanged,this,&ButtonsWidget06::checkBoxStateChangeSlot);
  16. //创建按钮组对象
  17. m_pButtonGroup = new QButtonGroup(this);
  18. //同一组中内容只能选一个
  19. m_pButtonGroup->setExclusive(true);
  20. m_pButtonGroup->addButton(ui.paintCheckBox, 0);
  21. m_pButtonGroup->addButton(ui.writeCheckBox, 1);
  22. m_pButtonGroup->addButton(ui.ballCheckBox, 2);
  23. //connect绑定有重载时,推荐使用Qt写法
  24. //buttonGroupClickedSlot:根据传入id显示对应提示框
  25. connect(m_pButtonGroup,SIGNAL(buttonClicked(int)),this,SLOT(buttonGroupClickedSlot(int));

2、输入类控件

1、组合框

1、下拉列表框

提供一个下拉列表供用户选择,也可以直接作为一个QLineEdit进行输入。QComoBox除了显示可见的下拉列表外,还可以每个项关联一个QVariant类型的变量,用于存储用户数据

QComoBox的常用方法:

  • addTtem()

  • addTtems()

  • 添加到下拉列表中的项都有一个下标,currentIndex()获取当前选中项的下标

  • currentText() 获取当前选中项的文本

  • itemText(int index) 返回指定项的文本

  • count()返回下拉框中的总项数

  1. 方法一:单个添加
  2. ui.comboBox->addItem(QStringLiteral("陕西省"));
  3. ui.comboBox->addItem(QStringLiteral("山西省"));
  4. ui.comboBox->addItem(QStringLiteral("河南省"));
  5. //清空下拉框中的列表项
  6. ui.comboBox->clear();
  7. 方法二:批量添加
  8. QStringList strProvince;
  9. strProvince << QStringLiteral("新疆自治区") << QStringLiteral("宁夏自治区") << QStringLiteral("壮族自治区");
  10. ui.comboBox->addItems(strProvince);
  11. ui.comboBox->clear();
  12. 方法三:添加带图标项
  13. QIcon iconl(":/ButtonsWidget06/image/1.png");
  14. QIcon icon2;
  15. icon2.addFile(":/ButtonsWidget06/image/2.png");
  16. ui.comboBox->addItem(iconl, QStringLiteral("新疆自治区"));
  17. ui.comboBox->addItem(icon2, QStringLiteral("宁夏自治区"));
  18. 方法四:添加具有用户数据的数据项
  19. QMap<QString, int> cityZoneMap;
  20. cityZoneMap.insert(QStringLiteral("北京市"), 100);
  21. cityZoneMap.insert(QStringLiteral("天津市"), 200);
  22. cityZoneMap.insert(QStringLiteral("上海市"), 300);
  23. cityZoneMap.insert(QStringLiteral("重庆市"), 400);
  24. for each(const QString &key in cityZoneMap.keys()) {
  25. ui.comboBox->addItem(key, cityZoneMap.value(key));
  26. }
  27. //指定项设置图标
  28. ui.comboBox->setItemIcon(4, iconl);

 2、字体下拉框

fontComboBox:Qt uI 界面内下拉框,里面包含各种字体

QFontComboBox::AllFonts 显示所有字体
QFontComboBox::ScalableFonts 显示可缩放字体d
QFontComboBox::NonScalableFonts 显示不可缩放字体
QFontComboBox::MonospacedFonts 显示等宽字体
QFontComboBox::ProportionalFonts 显示比例字体

  1. ui.fontComboBox->setFontFilters(QFontComboBox::ScalableFonts);
  2. //进行字体设置:下拉框字体选择后
  3. void ButtonsWidget06::on_fontComboBox_currentFontChanged(const QFont & font)
  4. {
  5. ui.fontLabel->setFont(font);
  6. }

2、单行文本编辑框

QLineEdit(行编辑器),是一个单行的文本编辑器,允许用户输入和编辑单行纯文本内容,而且它提供了复制、粘贴、撤销、剪切等功能。

1、显示模式:

  • Normal 正常模式

  • NoEcho 不显示模式

  • Password 密码模式

  • PasswordEchoOnEdit 输入时正常显示,失去输入焦点时显示为密码模式

2、焦点策略

  • Nofocus 控件不接受焦点

  • TabFocus 控件通过Tab按键接收焦点

  • ClickFocus 控件通过单击接收焦点

  • StrongFocus 控件通过Tab键和单击接收焦点

  • WheelFocus 控件通过鼠标滚轴

  1. ui.verifyLineEdit->setEchoMode(QLineEdit::Normal); //设置显示模式
  2. ui.verifyLineEdit->setFocusPolicy(Qt::StrongFocus); //设置焦点策略
  3. ui.verifyLineEdit->setMaxLength(10); //设置最大输入长度
  4. ui.verifyLineEdit->setPlaceholderText(QStringLiteral("请输入验证码"));//静态提示信息
  5. //QLineEdit输入内容的限制
  6. QIntValidator *pValid = new QIntValidator(100, 999, this);//创建整型效验器对象,参数1和参数2指定检查整数的范围
  7. ui.verifyLineEdit->setValidator(pValid);

 1、对输入的内容进行限制

正则表达式:
    是一种文本模式,包含普通字符和特殊字符,它使用单个字符串来描述、匹配一系列满足某个语法规则的字符串,通常用来检索替换那些符合某个规则的文本。
     正则表达式由表达式、量词和断言组成。最简单的一个表达式就是一个字符,例如x和5[ABC]可以匹配一个A或一个B或一个C,也可以简写成[A-C]
     量词:一个量词指定了必须要匹配的表达式出现的次数,例如x{1,1}表示只能匹配一个x,前面的1表示最少包含一个x,后面的1表示最多包含1个x
      断言:如果想匹配整个字符串,需要使用断言^和$,^表示从字符串的开始匹配,$表示一直匹配到末尾
      例如:写一个正则表达式匹配到0-99之间的整数,靠头和结尾都是数字    ^[0-9]{1,2}$
[]表示范围(闭区间)
{}表示量词的最少和最多
()表示从几项里面选择一项,多项间用 | 分割

表格1:正则表达式中的字符
一般可以使用一些特殊的符号表示常见的字符和常量
c字符本身    \c表示字符(a-z A-Z)    \d表示数字

  1. //创建正则表达式
  2. QRegularExpression regl("[0-9.-]+");
  3. //创建正则表达式验证器对象
  4. QRegularExpressionValidator *pValidator = new QRegularExpressionValidator(this);
  5. //把验证器对象指定正则表达式
  6. pValidator->setRegularExpression(regl);
  7. //验证器对象设置给LineEdit控件
  8. ui.verifyLineEdit->setValidator(pValidator);
2、 输入内容的对其方式
ui.passwordLineEdit->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//水平垂直方向都居中

3、头部或尾部添加图标
  1. QAction * userNameAction = new QAction(ui.userNameLineEdit);
  2. userNameAction->setIcon(icon2);//icon2地址
  3. ui.userNameLineEdit->addAction(userNameAction, QLineEdit::TrailingPosition);//tail

 4、自动补全
  1. //自动补全内容
  2. QStringList strList;
  3. strList << "Qt" << "Qt Assistant" << "Qt designer";
  4. //QCompleter:自动补全输入类
  5. QCompleter *com = new QCompleter(strList, this);
  6. //设置补全器大小写不敏感
  7. com->setCaseSensitivity(Qt::CaseInsensitive);
  8. //放入控件
  9. ui.userNameLineEdit->setCompleter(com);

5、常用信号

1、editingFinished 当单行文本编辑器失去焦点时发出该信号
2、textChanged    当行文本编辑框中为文本发生变化时,发出该信号,它与textEdited的区别是,通过代码(setText())改变文本时也会发出该信号
3、textEdited当文本编辑器被编辑时发出该信号,通过代码(setText())编辑文本时不会发出该信号

3、文本块编辑器 

QTextEdit:可以输入多行文本内容,可以显示图像、列表和表格等文本内容

常用方法:
       1、设置文本 setPlainText()    设置文本前会将之前的文本内容清空
       2、追加设置文本 insertPlainText()之前文本会保留
       3、获取文本内容    toPlainText()
       4、当文本内容较多时,可以自动出现水平或垂直滚动条
       5、改变文本块控间的背景色,还可以添加背景图片

  1. QString strPath = "D:\\cccccc\\QtApp\\ButtonsWidget06\\image\\1.png";
  2. //获取TextEdit的调色板(可以改变控件的背景色或设置图片)
  3. QPalette pal = ui.textEdit->palette();
  4. //设置调色板画刷
  5. //创建Qpixmap对象,调整Qpixmap的大小
  6. pal.setBrush(QPalette::Base, QPixmap(strPath).scaled(ui.textEdit->size()));
  7. ui.textEdit->setAutoFillBackground(true);//允许用户设置背景
  8. //将调色板设置给TextEdit
  9. ui.textEdit->setPalette(pal);
  10. //设置文本
  11. void ButtonsWidget06::on_appendButton_clicked()
  12. {
  13. //setPlainText() 每次设置,之前文本都会清空
  14. //insertPlainText() 尾部追加
  15. ui.textEdit->insertPlainText(QStringLiteral("红红火火恍恍惚惚哈哈哈哈哈哈哈哈哈"));
  16. }
  17. //获取文本
  18. void ButtonsWidget06::on_getButton_clicked()
  19. {
  20. QString strText = ui.textEdit->toPlainText();
  21. QMessageBox::information(nullptr, "text", strText);
  22. }
  23. void ButtonsWidget06::on_textEdit_textChanged()
  24. {
  25. //移动光标:每次插入文本后,自动将光标移动到末尾
  26. ui.textEdit->moveCursor(QTextCursor::End);
  27. }

 4、日期时间编辑器控件

QDateEdit、QTimeEdit、QDateTimeEdit

1、日期时间对象和字符类型的转换
2、信号:dateChanged(const QDate &date)、 dateTimeChanged(const QDateTime &datetime) 、timeChanged(const QTime &time)当日期时间发生改变时发射该信号
editingFinished  当控件失去焦点时发射信息

  1. //设置时间
  2. void ButtonsWidget06::on_timeButton_clicked()
  3. {
  4. QString timeStr = ui.timeLineEdit->text();
  5. //去除字符串两边空格
  6. timeStr.trimmed();
  7. //字符串转为时间格式,赋值给timeEdit
  8. ui.timeEdit->setTime(QTime::fromString(timeStr, "HH:mm:ss"));
  9. }
  10. //设置日期
  11. void ButtonsWidget06::on_dateButton_clicked()
  12. {
  13. QString dateStr = ui.dateLineEdit->text();
  14. //去除字符串两边空格
  15. dateStr.trimmed();
  16. //字符串转为时间格式,赋值给timeEdit
  17. ui.dateEdit->setDate(QDate::fromString(dateStr, "yyyy/MM/dd"));
  18. }
  19. //设置时间日期
  20. void ButtonsWidget06::on_dateTimeButton_clicked()
  21. {
  22. QString dateTimeStr = ui.dateTimeLineEdit->text();
  23. //去除字符串两边空格
  24. dateTimeStr.trimmed();
  25. //字符串转为时间格式,赋值给timeEdit
  26. ui.dateTimeEdit->setDateTime(QDateTime::fromString(dateTimeStr, "yyyy/MM/dd HH:mm:ss"));
  27. }
  28. //获取时间日期
  29. void ButtonsWidget06::on_getDateTimeButton_clicked()
  30. {
  31. //获取系统当前日期和时间
  32. QDateTime dateTime = QDateTime::currentDateTime();
  33. //设置时间
  34. //将时间对象设置到timeEdit上面
  35. ui.timeEdit->setTime(dateTime.time());
  36. //将时间对象转为字符串设置到QLineEdit上面
  37. ui.timeLineEdit->setText(dateTime.time().toString("HH:mm:ss"));
  38. //设置日期
  39. ui.dateEdit->setDate(dateTime.date());
  40. ui.dateLineEdit->setText(dateTime.date().toString("yyyy/MM/dd"));
  41. //设置日期时间
  42. ui.dateTimeEdit->setDateTime(dateTime);
  43. ui.dateTimeLineEdit->setText(dateTime.toString("yyyy/MM/dd HH:mm:ss"));
  44. }
  45. //日期控件显示默认日历
  46. ui.dateEdit->setCalendarPopup(true);
  47. ui.dateTimeEdit->setCalendarPopup(true);

 5、水平或竖直滚动条

QScrollBark,一般不单独使用,常配合容器类控件一块使用

 6、滑动条

QSlider:

滑动条提供了水平和竖直两种,他是用于控制有界值的典型控件,它允许用户沿着在水平或竖直方向移动滑块,并将滑块所在的位置转换成一个合法范围的数值。
常用函数:
       1、setRange() 用来设置滑动条的范围
       2、setValue() 可以设置滑块的当前值
       3、setMinimum 和setMaxImum()
       4、setTickPostion() 设置刻度在滑动条的上方还是下方
       5、setTickInterval()设置刻度间隔

  1. ui.horizontalSlider->setRange(0, 299);//设置范围
  2. ui.horizontalSlider->setTickPosition(QSlider::TicksAbove);//保存刻度位置
  3. ui.horizontalSlider->setTickInterval(30);//设置间隔
  4. ui.horizontalSlider->setValue(0);//设置默认值

 练习:用滑块控制颜色,用QSpinBox控制红色滑动条

  1. //设置滑动块范围
  2. ui.horizontalSliderRed->setRange(0, 255);
  3. ui.horizontalSliderGreen->setRange(0, 255);
  4. ui.horizontalSliderBlue->setRange(0, 255);
  5. //设置初始值
  6. ui.horizontalSliderRed->setValue(0);
  7. ui.horizontalSliderGreen->setValue(0);
  8. ui.horizontalSliderBlue->setValue(0);
  9. //设置间隔
  10. ui.horizontalSliderRed->setTickInterval(5);
  11. ui.horizontalSliderGreen->setTickInterval(5);
  12. ui.horizontalSliderBlue->setTickInterval(5);
  13. //关联滑动条
  14. connect(ui.horizontalSliderRed, &QSlider::valueChanged, this, &ScrollControlWidget::colorSliderValueChangeSlot);
  15. connect(ui.horizontalSliderGreen, &QSlider::valueChanged, this, &ScrollControlWidget::colorSliderValueChangeSlot);
  16. connect(ui.horizontalSliderBlue, &QSlider::valueChanged, this, &ScrollControlWidget::colorSliderValueChangeSlot);
  17. void ScrollControlWidget::colorSliderValueChangeSlot()
  18. {
  19. int nRel = ui.horizontalSliderRed->value();
  20. int nGreen = ui.horizontalSliderGreen->value();
  21. int nBule = ui.horizontalSliderBlue->value();
  22. //创建颜色对象
  23. QColor color(nRel, nGreen, nBule);
  24. //获取调色板
  25. QPalette pal = ui.textEdit->palette();
  26. //设置颜色
  27. pal.setColor(QPalette::Base, color);
  28. //调色板颜色赋值给QtextEdit
  29. ui.textEdit->setPalette(pal);
  30. }

7、旋转框 

QSpinBox:

1、setSingLeStep 改变间隔

2、其他方法与QSlider方法名相同
3、信号:valueChanged(int)或 valueChanged(QString)

  1. //将QSpinBox的范围设置为0-255,在其valueChange信号对应的槽函数中,获取界面值,设置到红色滑动条上
  2. ui.spinBox->setRange(0, 255);
  3. //ui.spinBox->setMaximum(100);//默认最大值
  4. //ui.spinBox->setMinimum(100);//默认最小值
  5. ui.spinBox->setSingleStep(20);

 三、显示类控件

1、标签控件

QLabel:用于显示文本或图片,适合显示信息量较小的内容,不能和用户进行交互操作

 1、显示文字

  1. ui.textLabel->setAlignment(Qt::AlignTop | Qt::AlignVCenter);//设置文本对齐方式
  2. ui.textLabel->setText(QStringLiteral("通常用于显示文本或图片,适合显示信息量较小的内容,不能和用户进行交互操作"));//设置label上的文本内容
  3. ui.textLabel->setWordWrap(true);//设置换行
  4. ui.textLabel->setFrameShape(QFrame::Box);
  5. ui.textLabel->setToolTip("wwwwwww");
  6. //参数1:字体组名称 参数2:字体大小 参数3:字体粗细
  7. QFont font("Microsoft YaHei", 12, 20);
  8. ui.textLabel->setFont(font);

 2、显示gif动图

  1. //创建QMovie对象
  2. QMovie *pMovie = new QMovie(":/ButtonsWidget06/image/findelement.gif");
  3. ui.movieLabel->resize(400, 200);//图片大小
  4. ui.movieLabel->setScaledContents(true);//图片自适应
  5. ui.movieLabel->setMovie(pMovie);//设置动图
  6. pMovie->start();//开始播放

 3、显示图片

  1. QPixmap image;
  2. image.load(":/ButtonsWidget06/image/pic3.jpg");//设置图片路径
  3. ui.ImageLabel->setPixmap(image);//添加图片
  4. ui.ImageLabel->setScaledContents(true);//设置图片自适应

 2、进度条

  1. ui.progressBar->setMinimum(0);
  2. ui.progressBar->setMaximum(0);
繁忙指示

 四、容器类控件

容器类控件:可以放置其他控件的控件
    1、分组框QGroupBox:通常带有一个边框和标题栏,作为容器部件来使用,在其中可以放各种窗口部件
    2、QScrollArea自动滚动区
        它使一个容器控件,其中可以放置各种控件,当控件超出其显示范围时,可以通过滚动条来查看子控件。注意:外面控件的大小小于里面控件的大小才会出现滚动条
    3、QToolBox选项卡控件(抽屉控件)
        它有一组选项卡,每个选项卡下有一个Qwidget控件,我们将子控件放到Qwidget上面
        每一个page都有一个索引位置下标,下标从0开始,多个page有顺序的,默认按照添加顺序排布
        每个page都有ItemText,还可以设置ItemIcon、itemToolTip等
        常用方法:
            1、setItemText()设置选项卡的文本
            2、setItemIcon()设置图标
            3、count()获取数目:有几个page
            4、setItemEnbled()将某个选项卡禁能
            5、addItem()添加选项卡

1、分组框 

2、选项卡控件

  1. //QToolBox
  2. int count = ui.toolBox->count();
  3. qDebug() << count;
  4. //设置工具箱中index位置选项卡的标题
  5. ui.toolBox->setItemText(0, QStringLiteral("小学"));
  6. ui.toolBox->setItemText(1, QStringLiteral("初中"));
  7. ui.toolBox->setItemText(2, QStringLiteral("高中"));
  8. //在工具箱的指定位置添加一个选项卡
  9. ui.toolBox->insertItem(3, new QPushButton,QStringLiteral("大学"));
  10. //给工具箱尾部添加一个选项卡
  11. ui.toolBox->addItem(new QWidget, QStringLiteral("E"));
  12. //给工具箱尾部添加一个带图标的选项卡
  13. QIcon icon(":/ButtonsWidget06/image/1.png");//图标路径
  14. ui.toolBox->addItem(new QWidget, icon, QStringLiteral("F"));
  15. //移除工具箱中索引index位置对应的选项卡, 注意: 小部件没有被删除
  16. //ui.toolBox->removeItem(5);
  17. //设置索引index位置的选项卡是否可用, 参数 enabled=true为可用, enabled=false为禁用
  18. ui.toolBox->setItemEnabled(4, false);
  19. //设置工具箱中index位置选项卡的图标
  20. ui.toolBox->setItemIcon(0, QIcon(":/ButtonsWidget06/image/2.png"));
  21. //设置工具箱中index位置选项卡的提示信息(需要鼠标在选项卡上悬停一定时长才能显示)
  22. ui.toolBox->setItemToolTip(2,QStringLiteral("俺也不知道"));
  23. //如果位置索引的项已启用,则返回true;否则返回false。
  24. qDebug()<<ui.toolBox->isItemEnabled(0);
  25. // 返回位置索引处项目的图标,如果索引超出范围,则返回空图标。
  26. qDebug() << QIcon(ui.toolBox->itemIcon(0));
  27. // 返回工具箱中包含的项的数量。
  28. qDebug() << ui.toolBox->count();

五、项目控件

  • List Widget:列表控件
  • Tree Widget:树形控件
  • Table Widget:表格控件

Qt中用于项处理的组件有两类:

    一类是ItemViews,包扩QListView、QtreeView、QTableView和QColumnView等。
    一类是Item Widgets,包括QListWidget(项目列表)、QtreeWidget(多层次树)和QTableWidget(表格)
    前者基于模型/视图(Model/View),需要自己来建立模型保存数据,这样组织数据可以降低数据冗余,提高编程效率,但需要对模型视图有一点的了解。
    后者可以看作前者的升级版,它不需要我们自己去建模,他已经为我们建立了一个数据存储模型QListWidgetItem,我们可以通过addItem()直接使用这个数据模型来添加数据。

1、列表控件

QListWidget常用方法
    1、addItem()添加
    2、insertItem()插入
    3、item()获取
    4、takeItem()删除
    5、clear()清空
    6、setAlternatingRow()开启交替行颜色显示
常用信号:
    1、currentItemChange    当前项改变时发出信号
    2、itemClicked    点击某些时发出

实现代码:

  1. m_pMenu = new QMenu(this);
  2. m_pAddAction = new QAction(QStringLiteral("添加"));
  3. m_pInsAction = new QAction(QStringLiteral("插入"));
  4. m_pClearAction = new QAction(QStringLiteral("清空"));
  5. m_pMenu->addAction(m_pAddAction);
  6. m_pMenu->addAction(m_pInsAction);
  7. m_pMenu->addAction(m_pClearAction);
  8. connect(m_pAddAction, &QAction::triggered, this, &itemProgect07::on_pushButtonAdd_clicked);
  9. connect(m_pInsAction, &QAction::triggered, this, &itemProgect07::on_pushButtonIns_clicked);
  10. connect(m_pClearAction, &QAction::triggered, this, &itemProgect07::on_pushButtonClear_clicked);
  11. //单选按钮添加到按钮组中并关联槽函数
  12. m_pButtonGroup = new QButtonGroup(this);
  13. m_pButtonGroup->addButton(ui.iconRadioButton, 1);
  14. m_pButtonGroup->addButton(ui.listRadioButton, 0);
  15. connect(m_pButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(OnModeChangeSlot(int)));
  16. //设置QListWidget为列表模式
  17. ui.listWidget->setViewMode(QListView::ListMode);
  18. //初始打开界面,显示图标模式
  19. ui.listRadioButton->setChecked(true);
  20. ui.listWidget->setAlternatingRowColors(true);//行交替显示颜色

绑定的槽函数:

  1. //添加某一行
  2. void itemProgect07::on_pushButtonAdd_clicked()
  3. {
  4. ui.listWidget->addItem(QStringLiteral("山西省"));
  5. //添加带图标的列表项
  6. QIcon icon(":/itemProgect07/image/1.png");
  7. QListWidgetItem *item = new QListWidgetItem(icon, QStringLiteral("河南省"));
  8. ui.listWidget->addItem(item);
  9. QListWidgetItem *item2 = new QListWidgetItem(QIcon(":/itemProgect07/image/2.png"), QStringLiteral("广东省"));
  10. ui.listWidget->addItem(item2);
  11. }
  12. //插入某一行
  13. void itemProgect07::on_pushButtonIns_clicked()
  14. {
  15. QListWidgetItem *item = new QListWidgetItem(QIcon(":/itemProgect07/image/3.png"), QStringLiteral("台湾省"));
  16. //默认获取第0行,如果用户没有点击某行,默认返回下标为0的行
  17. int row = ui.listWidget->currentRow();
  18. //在指定行nRow的上方插入一行
  19. ui.listWidget->insertItem(row, item);
  20. }
  21. //删除某一行
  22. void itemProgect07::on_pushButtonDal_clicked()
  23. {
  24. //方法一
  25. //获取当前行对象
  26. QListWidgetItem *item = ui.listWidget->currentItem();
  27. ui.listWidget->removeItemWidget(item);
  28. //需要手动释放item
  29. delete item;
  30. //方法二
  31. /*int row = ui.listWidget->currentRow();
  32. ui.listWidget->takeItem(row);*/
  33. }
  34. //清空
  35. void itemProgect07::on_pushButtonClear_clicked()
  36. {
  37. ui.listWidget->clear();
  38. }
  39. void itemProgect07::OnModeChangeSlot(int id)
  40. {
  41. if (0 == id)
  42. {
  43. ui.listWidget->setViewMode(QListView::ListMode);
  44. }
  45. else {
  46. ui.listWidget->setViewMode(QListView::IconMode);
  47. }
  48. }
  49. //当前选中项
  50. void itemProgect07::on_listWidget_itemClicked(QListWidgetItem * item)
  51. {
  52. //获取文本
  53. QString strText = item->text();
  54. ui.lineEdit->setText(strText);
  55. }
  56. void itemProgect07::on_listWidget_customContextMenuRequested(const QPoint & pos)
  57. {
  58. //在鼠标光标出现的位置显示菜单
  59. m_pMenu->exec(QCursor::pos());
  60. }

2、树形控件

QTreeWidget的常用方法:
    1、setCheckState()
    2、childCount()
    3、child()
 信号:itemClicked

 实现代码:

  1. //树形控件
  2. ui.treeWidget->setHeaderHidden(true);//隐藏树形的表头
  3. QTreeWidgetItem *topItem1 = new QTreeWidgetItem(ui.treeWidget);
  4. topItem1->setText(0, QStringLiteral("阿里巴巴"));
  5. topItem1->setCheckState(0, Qt::Unchecked);//默认不选上
  6. ui.treeWidget->addTopLevelItem(topItem1);
  7. //创建研发部子节点
  8. QTreeWidgetItem *developItem = new QTreeWidgetItem(topItem1);
  9. developItem->setText(0, QStringLiteral("研发部"));
  10. developItem->setCheckState(0, Qt::Unchecked);//checked默认选上
  11. //研发一组
  12. QTreeWidgetItem *developOne = new QTreeWidgetItem(developItem);
  13. developOne->setText(0, QStringLiteral("研发一组"));
  14. developOne->setCheckState(0, Qt::Unchecked);
  15. //研发二组
  16. QTreeWidgetItem *developTwo = new QTreeWidgetItem(developItem);
  17. developTwo->setText(0, QStringLiteral("研发二组"));
  18. developTwo->setCheckState(0, Qt::Unchecked);
  19. //创建销售部
  20. QTreeWidgetItem *saleItem = new QTreeWidgetItem(topItem1);
  21. saleItem->setText(0, QStringLiteral("销售部"));
  22. saleItem->setCheckState(0, Qt::Unchecked);
  23. //销售一组
  24. QTreeWidgetItem *saleOne = new QTreeWidgetItem(saleItem);
  25. saleOne->setText(0, QStringLiteral("销售一组"));
  26. saleOne->setCheckState(0, Qt::Unchecked);
  27. //展开所有节点
  28. ui.treeWidget->expandAll();
  29. //点击某个父节点,其下索引子节点的勾选状态会变化
  30. connect(ui.treeWidget, &QTreeWidget::itemClicked, this, &itemProgect07::OnSelectAllItemSlot);

绑定槽函数:

  1. //父层勾选,其子层也勾选
  2. void itemProgect07::OnSelectAllItemSlot(QTreeWidgetItem * item, int column)
  3. {
  4. //获取子节点个数
  5. int size = item->childCount();
  6. for (int i = 0; i < size; i++)
  7. {
  8. //获取子节点item
  9. QTreeWidgetItem *childItem = item->child(i);
  10. if (childItem == nullptr)
  11. {
  12. return;
  13. }
  14. int count = childItem->childCount();
  15. //item->checkState(0):获取父节点的勾选状态,设置给子节点
  16. childItem->setCheckState(0, item->checkState(0));
  17. for (int j = 0; j < count; j++)
  18. {
  19. QTreeWidgetItem *innerChild = childItem->child(j);
  20. if (nullptr != innerChild)
  21. {
  22. innerChild->setCheckState(0, childItem->checkState(0));
  23. }
  24. }
  25. }
  26. }

3、表格控件

QTableWidget,是Qt中的表格组件,用于表示行列组成的二维表,表格一般有表头。
QTableWidget常用方法:
    1、setRowCount()
    2、setColunmnCount()
    3、setHorizontalHeaderItem()
    4、setItem()/item()

 

  1. //初始化表头/标题
  2. void itemProgect07::on_setHeadBtn_clicked()
  3. {
  4. QStringList headList;
  5. headList << QStringLiteral("姓名") << QStringLiteral("性别") << QStringLiteral("学号") << QStringLiteral("年龄") << QStringLiteral("年级");
  6. //设置表格列的数目
  7. ui.tableWidget->setColumnCount(headList.count());
  8. QTableWidgetItem *headItem;
  9. //获取表格中的列数:columnCount()
  10. for (int i = 0; i < ui.tableWidget->columnCount(); i++)
  11. {
  12. headItem = new QTableWidgetItem(headList.at(i));
  13. QFont font = headItem->font();
  14. font.setBold(true);//字体加粗
  15. font.setPointSize(12);//颜色
  16. headItem->setTextColor(Qt::red);//字体颜色
  17. headItem->setFont(font);
  18. ui.tableWidget->setHorizontalHeaderItem(i, headItem);
  19. }
  20. }
  21. //初始化行数
  22. void itemProgect07::on_setRowBtn_clicked()
  23. {
  24. //设置表格的行数,设置10行,行号0-9
  25. ui.tableWidget->setRowCount(ui.spinBox->value());
  26. //设置交易行背景色
  27. ui.tableWidget->setAlternatingRowColors(true);
  28. }
  29. //初始化数据
  30. void itemProgect07::on_initDataBtn_clicked()
  31. {
  32. //姓名、性别、学号、年龄、年级
  33. QString strName, strGender, strNum, strAge, strGrade;
  34. ui.tableWidget->clearContents();//只清除数据,不清楚表头
  35. //行数
  36. int nRow = ui.tableWidget->rowCount();
  37. //行循环
  38. for (int i = 0; i < nRow; i++)
  39. {
  40. if (i % 2 == 0)
  41. {
  42. strGender = QStringLiteral("女");
  43. }
  44. else
  45. {
  46. strGender = QStringLiteral("男");
  47. }
  48. //列循环
  49. for (int j = 0; j < ui.tableWidget->columnCount(); j++)
  50. {
  51. //姓名
  52. if (j == 0)
  53. {
  54. //格式化字符串
  55. strName = QStringLiteral("学生%1哈哈").arg(i);
  56. //创建单元格
  57. QTableWidgetItem *itemName = new QTableWidgetItem(strName);
  58. //单元格内容添加到表格上面
  59. ui.tableWidget->setItem(i, j, itemName);
  60. }
  61. //性别
  62. if (j == 1) {
  63. //性别
  64. QTableWidgetItem *itemGender = new QTableWidgetItem(strGender);
  65. ui.tableWidget->setItem(i, j, itemGender);
  66. }
  67. //学号
  68. if (j == 2) {
  69. strNum = QString("202300%1%2").arg(i).arg(j);
  70. QTableWidgetItem *itemNum = new QTableWidgetItem(strNum);
  71. ui.tableWidget->setItem(i, j, itemNum);
  72. }
  73. //年龄
  74. if (j == 3) {
  75. strAge = QString::number(i + j);
  76. QTableWidgetItem *itemAge = new QTableWidgetItem(strAge);
  77. ui.tableWidget->setItem(i, j, itemAge);
  78. }
  79. //年级
  80. if (j == 4) {
  81. strGrade = QString::number(i + 1);
  82. QTableWidgetItem *itemGrade = new QTableWidgetItem(strGrade);
  83. ui.tableWidget->setItem(i, j, itemGrade);
  84. }
  85. }
  86. }
  87. }
  88. //插入行
  89. void itemProgect07::on_insertRowBtn_clicked()
  90. {
  91. int curRow = ui.tableWidget->currentRow();
  92. if (curRow == -1)
  93. {
  94. QMessageBox::information(nullptr, QStringLiteral("提示"), QStringLiteral("请先选择一行"));
  95. return;
  96. }
  97. ui.tableWidget->insertRow(curRow);
  98. for (int i = 0; i < ui.tableWidget->columnCount(); i++)
  99. {
  100. QTableWidgetItem *item = new QTableWidgetItem("Insert");
  101. ui.tableWidget->setItem(curRow, i, item);
  102. }
  103. }
  104. //删除行
  105. void itemProgect07::on_deleteRowBtn_clicked()
  106. {
  107. int nRow = ui.tableWidget->currentRow();
  108. if (nRow == -1)
  109. {
  110. QMessageBox::information(nullptr, QStringLiteral("提示"), QStringLiteral("请先选择一行"));
  111. return;
  112. }
  113. ui.tableWidget->removeRow(nRow);
  114. }
  115. //调整行高
  116. void itemProgect07::on_modifyHeigthBth_clicked()
  117. {
  118. ui.tableWidget->resizeRowsToContents();
  119. }
  120. //调整列宽
  121. void itemProgect07::on_modifyWidthBtn_clicked()
  122. {
  123. ui.tableWidget->resizeColumnsToContents();
  124. }
  125. //读取数据
  126. void itemProgect07::on_readDataBtn_clicked()
  127. {
  128. QString strText;
  129. QTableWidgetItem *cellItem;
  130. ui.textEdit->clear();//清空文本块编辑器内容
  131. //逐行
  132. for (int i = 0; i < ui.tableWidget->rowCount(); i++)
  133. {
  134. strText = QStringLiteral("第%1行:").arg(i+1);
  135. //逐列
  136. for (int j = 0; j < ui.tableWidget->columnCount(); j++)
  137. {
  138. cellItem = ui.tableWidget->item(i, j);
  139. QString str = cellItem->text();
  140. //字符串拼接
  141. strText = strText + str +" ";
  142. }
  143. strText += "\n";
  144. ui.textEdit->insertPlainText(strText);
  145. }
  146. }

 六、图形视图(了解)

        Qt中和图形视图相关的类有三个:QGraphiocsView视图类、QGraphicsScene场景类、QGraphicsItem场景项
        前者的关系是场景项(直线、按钮、圆形、文本)    需要添加到场景类中,场景类需要添加到视图类中才能显示出来。
        这三个类通常用于二位或三维图形显示开发,能够快速显示万亿级别的视图。

 

  1. #include<QtWidgets/QApplication>
  2. #include <QGraphicsView>
  3. #include <QGraphicsScene>
  4. #include <QGraphicsItem>
  5. #include <QPushButton>
  6. #include <QGraphicsEllipseItem>
  7. int main(int arg, char *argv[])
  8. {
  9. QApplication a(arg, argv);
  10. //创建场景对象
  11. QGraphicsScene scene(-200, -200, 400, 400);
  12. //创建试图对象并将场景添加到试图中
  13. //方式一:QGraphicsScene提供的默认添加项的方法
  14. QGraphicsItem *item = scene.addText("Hello world", QFont("宋体", 12));
  15. //QPushButton *btn = new QPushButton("button");
  16. //scene.addWidget(btn);
  17. //方式二:自己创建对象,然后添加(灵活,可以自己调整位置)
  18. QGraphicsEllipseItem item1(0, 0,100,100);
  19. item1.setPos(50, 50);
  20. scene.addItem(&item1);
  21. QGraphicsLineItem item2(0, 0, 150, 150);
  22. scene.addItem(&item2);
  23. //展示两个窗口
  24. QGraphicsView view;
  25. view.setScene(&scene);
  26. view.show();
  27. QGraphicsView view1;
  28. view1.setScene(&scene);
  29. view1.show();
  30. return a.exec();
  31. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/346765
推荐阅读
相关标签
  

闽ICP备14008679号