文章目录
前言
本文介绍我们系列文章QT常用控件的最后一个按钮,QDialogButtonBox
按钮编程。通过这个例子,巩固QT的信号与槽知识,了解Qt5对Qt4所做的改进。由于我们的开发的软件显示和输入需要在触摸屏上进行,因此本例演示了如何弹出一个小键盘。
本例程设计是在chatgpt的帮助下完成的,编译代码经过测试通过。
感谢朋友提供的chatgpt软件,特别是其中的gpt-box桌面工具,更是我离不开的工具。感兴趣的同仁可前往一观(www.apsuai.com)。
我们的调试环境仍然是双架构Kits
,编译调试在当前的ubuntu(qt5)中进行,重新编译后下载到目标arm设备(qt4)中运行。
我们的编程环境为:Ubuntu64位系统(22.04),目标架构:
(1) qt5 x86_64
架构;
(2)qt4 32位arm
架构。
环境配置请参见《Qt常用的按钮控件编程(一)》第1节。
8、QDialogButtonBox
按钮
QDialogButtonBox 是在 Qt 中用于显示一组标准窗口操作按钮的小部件,如“确定”、“取消”、“应用”按钮等。它可以将其中的按钮排列成横向(水平)或纵向(垂直)布局,也可以根据需要添加自定义按钮。
常用的标准按钮类型包括:
- OK:显示“确定”按钮;
- Cancel:显示“取消”按钮;
- Close:显示“关闭”按钮;
- Apply:显示“应用”按钮;
- Reset:显示“重置”按钮;
- Help:显示“帮助”按钮。
使用 QDialogButtonBox 控件的好处在于,它会自动以标准的方式处理按钮的布局和按键事件,可以避免手动设置布局和连接信号和槽的繁琐过程。它还可以根据窗口的样式,在样式表的作用下,呈现一致美观的界面,降低了开发的复杂度和难度。
8.1 向chatgpt提出的要求
向chatgpt提出的要求如下:
“使用Qt Creator 创建一个c++例程,项目名称"_qdialogbuttonbox" ,基类不选默认MainWindow类,而选择Widget作为基类,不要勾选“Generate form”,不使用拖取控件,控件全部采用编程。主窗口大小800*480,在主窗口上,放置一个QPushButton按钮,位于主窗口正中,点击,弹出一个对话框,对话框中有一个小键盘,可以设置ip地址和端口号,两个QDialogButtonBox,分别为确定和取消,确定后,调试打印出ip和端口。”
chatgpt根据要求给出了完整的例程,但与我希望需求的要进行些许调整:
- 控件的布局看起来不怎么合理,做了调整;
- 例程按照qt5完成,需要调整兼容qt4。
8.2 例程功能和程序执行效果
在主窗口上,放置一个QPushButton按钮,点击,弹出一个对话框,可以设置ip地址和端口号,两个QDialogButtonBox,分别为确定和取消,确定后,调试打印出ip和端口。
在主窗口上,放置一个QPushButton按钮,位于主窗口正中,点击,弹出一个对话框,对话框用来设置ip地址和端口号,点击ip提示和端口提示,弹出小键盘,可以设置两个QDialogButtonBox,分别为确定和取消,确定后,调试打印出ip和端口。设计一下。
程序执行效果:
-
主界面:
-
出现设置对话框
- 点击IP或Port,用弹出的小键盘输入ip地址和端口号,如下图:
输入IP地址和端口号,在终端输出区,打印出调试信息:
警告信息处理
直接运行:
./_qdialogbuttonbox
会出现下面的警告:
Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.
出现上面的警告原因是因为我们的ubuntu22.04系统默认使用Wayland作为显示服务器。而Qt框架默认使用X11作为显示服务器,将运行改为:
XDG_SESSION_TYPE=x11 ./_qdialogbuttonbox
或分两步:
export XDG_SESSION_TYPE=x11
./_qdialogbuttonbox
则警告消失。
8.3 生成项目
使用Qt Creator 创建一个c++例程,项目名称"_qdialogbuttonbox" ,不选默认MainWindow类,选择Widget作为基类,不要勾选“Generate form”,不使用拖取控件,控件全部采用编程。将两个配置好的Kits同时选上,项目新建完成如下图。(详细的项目新建过程参见:《Qt常用的按钮控件编程(一)》)。
点击左侧的Debug选项,可以看到两个编译套件Kit,可以选择编译运行在不同平台上的可执行文件,arm-v7为arm架构的设备,使用Qt4库,而桌面则是当前ubuntu系统,使用Qt5。
8.4 代码编辑
8.4.1 修改项目文件_qdialogbuttonbox.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
dialog.cpp \
keypaddialog.cpp \
main.cpp \
widget.cpp
HEADERS += \
dialog.h \
keypaddialog.h \
widget.h
# Default rules for deployment.
qnx: target.path = /tmp/$${
TARGET}/bin
else: unix:!android: target.path = /opt/$${
TARGET}/bin
!isEmpty(target.path): INSTALLS += target
# 根据使用的 Qt 版本设置编译条件
greaterThan(QT_MAJOR_VERSION, 4) {
# 如果使用的是 Qt 5 或者更新版本
message("使用的是 Qt 5版本")
} else {
# 如果使用的是 Qt 4 或者更早的版本
message("使用的是 Qt 4版本")
DEFINES += QT_ARM_PLATFORM
QMAKE_CXXFLAGS += -std=c++11
QMAKE_CXXFLAGS += -Wno-psabi -Wno-deprecated-declarations
LIBS += -lts
}
8.4.2 修改 main.cpp
#include "widget.h"
#include <QApplication>
#ifdef QT_ARM_PLATFORM
#include <QTextCodec>
#endif
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
#ifdef QT_ARM_PLATFORM
//解决Qt4中文乱码
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("system")); //若英文系统,则用GBK
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"