Qt编程指南

Qt是一个开源的C++应用程序框架,它拥有完备的C++图形库和集成了一系列代码模块简化难度,
Qt支持C++,Python,QML,Javascript等多种语言,适合多种技术、开发方式


■ 定时器

1.启动定时器
定时器ID startTimer (时间间隔);
int idt = startTimer (250);
每隔指定的时间间隔,触发一次定时器事件。
2.定时器事件处理
virtual void timerEvent (QTimeEvent* envet);
每当定时器事件触发时,该虚函数被自动调用。
通过QTimeEvent::timerId()区分不同的定时器。
3.关闭定时器
killTimer (定时器ID);

■ 鼠标事件

1.鼠标键按下
virtual void mousePressEvent (QMouseEvent*);
2.鼠标键弹起
virtual void mouseReleaseEvent (QMouseEvent*);
3.鼠标键双击
virtual void mouseDoubleClickEvent (QMouseEvent*);
4.鼠标键按下的同时移动
virtual void mouseMoveEvent (QMouseEvent*);
触发按键:
Qt::MouseButton QMouseEvent::button (void);
Qt::LeftButton
Qt::MiddleButton
Qt::RightButton
按键状态:
Qt::MouseButtons QMouseEvent::buttons (void);
Qt::LeftButton

■ QT事件

  1. Qt使用了一个事件队列,当新的事件发生时,会被追加到事件队列的尾部,前一个事件完成以后,取出后面的时间进行处理。
    2 . 必要时候Qt事件也是可以不进入事件队列的,而是直接处理。
  2. 事件还可以使用 “事件过滤器” 进行过滤。
  3. 我们使用组件关心的是信号槽;如果自定义组件,我们关心的是事件,因为我们可以通过事件来改变组件的默认操作。
  4. QApplication对象,然后调用了它的exec()函数,其实这个函数就是开始QT的事件循环,
  5. Qt创建一个事件对象,QT所有的事件都继承于QEvent类。在事件对象创建完毕后,QT将这个事件对象传递给QObject的event()函数。Event()函数不直接处理事件,而是按照事件对象的类型分派特定的事件处理函数。
  6. Qt事件处理分五个层次:重定义事件处理函数、重定义event()函数、为单个组件安装事件过滤器、为QApplication安装事件过滤器、重定义QCoreApplication的notify()函数。这几个层次的控制是逐层增大的。
  7. 事件比信号槽优点:1事件分发可以使同步也可以使异步的,2 事件可以使用过滤器。

■ 计算函数

fabs((double)minValue) //绝对值
double margin = qMax(fabs((double)minValue), fabs((double)maxValue)); //最大值
qMin(minValue, maxValue) //最小值
qSwap(wWidget, hWidget); //互换
qSwap(wLabel, hLabel); //互换
qAsin(),qAtan2()等三角函数的返回值是弧度而不是角度,因此要将弧度转化为角度。弧度=角度*Pi/180以qAtan()函数为例
qSqrt
qPow


■ Qt代码注意点:

QPushButton *bt = static_cast(sender()); //通过sender() 可以直接得到激活此次槽函数调用的QObject对象的地址
//由于确定是按钮所以直接强转

■ qDebug()

qDebug() << LINE <<FUNCTION << endl;

//将文本框拿出来
QList edits = this->findChildren();
edit = edits.first();
edit->setFrame(true);
edit->setAlignment(Qt::AlignCenter);
edit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);


■ 模态 ,非模态 ,半模态对话框

QWidget提供了setWindowModality()方法设置窗口半模态or非模态;

非模态对话框 Qt::NonModal 对应QDialog::show()
又叫做无模式对话框,即弹出非模态对话框时,用户仍然可以对其他窗口进行操作,不会因为这个对话框未关闭就不能操作其他

模态对话框 Qt::ApplicationModal 对应QDialog::exec()
弹出模态对话框时,除了该对话框整个应用程序窗口都无法接受用户响应,处于等待状态,直到模态对话框被关闭。
模态对话框的作用就是得到用户选择的结果,根据结果来进行下面的操作。
Qt::ApplicationModal 应用程序级模态对话框,即会阻塞整个应用程序的所有窗口。(半模态对话框)窗口。

半模态对话框 Qt::WindowModal 对应 QDialog::open()
半模态对话框区别于模态与非模态对话框,或者说是介于两者之间,也就是说半模态对话框会阻塞窗口的响应,但是不会影响后续代码的执行。
Qt::WindowModal 窗口级模态对话框,即只会阻塞父窗口、父窗口的父窗口及兄弟窗口。(半模态对话框)

void frmInputTool::on_btnDialog_clicked()
{
#if 0
//对话框窗体exec的话需要设置Qt::WindowModal不然会阻塞
static Dialog2 dialog;
dialog.setWindowModality(Qt::WindowModal);
dialog.raise();
if (!dialog.isVisible()) {
qDebug() << opoperer11;
dialog.exec();
}
qDebug() << opoperer; //这里不会执行,
#else
static Dialog2 *dialog = 0;
if (dialog == 0) {
dialog = new Dialog2;
}
dialog->show();
#endif
}


Qt事件同步和异步分发

sendEvent 发出的事件会立即被处理,也就是“同步”执行。
postEvent 发送的事件会被加入事件队列,在下一轮事件循环时才处理,也就是“异步”执行。
sendPostedEvents,是将已经加入队列中的准备异步执行的事件立即同步执行。


QMessageBox
QMessageBox messageBox(QMessageBox::NoIcon,语言,是否修改为English,请重启生效,QMessageBox::Yes|QMessageBox::No,NULL);
messageBox.setFixedSize(400,300);
int iResult = messageBox.exec();
switch(iResult)
{
case QMessageBox::Yes:
(*configJson->RootObjPointer())[Language]=English;
configJson->savejsonfile();
break;
case QMessageBox::No:
break;
default:
break;
}


■ Qt事件循环(exec、eventloop)

QApplicaion::exec()、QMessageBox::exec()都是事件循环。其中前者又被称为主事件循环。QEventLoop::quit()能够终止事件循环。
当事件太多而不能马上处理完的时候,待处理事件被放在一个“队列”里,称为“事件循环队列”。当事件循环处理完一个事件后,就从“事件循环队列”中取出下一个事件处理之。当事件循环队列为空的时候,它和一个啥事也不做的永真循环有点类似,但是和永真循环不同的是,事件循环不会大量占用CPU资源。
事件循环的本质就是以队列的方式再次分配线程时间片。

事件循环是可以嵌套的,一层套一层,子层的事件循环执行exec()的时候,父层事件循环就处于中断状态;当子层事件循环跳出exec()后,父层事件循环才能继续循环下去。
如果某个子事件循环仍然有效,但其父循环被强制跳出,此时父循环不会立即执行跳出,而是等待子事件循环跳出后,父循环才会跳出。


■ Qt事件-发送-过滤

void frmInput2019::sendEvent(quint8 type, const QString &text)
{
if (type == 0) {
//切换中英模式
QMouseEvent mousePress(QEvent::MouseButtonPress, QPoint(0, 0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
QApplication::sendEvent(ui->labType->isVisible() ? ui->labType : ui->labType2, &mousePress);
} else if (type == 1) {
//隐藏汉字候选面板
QMouseEvent mousePress(QEvent::MouseButtonPress, QPoint(0, 0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
QApplication::sendEvent(ui->labMore, &mousePress);
} else if (type == 2) {
//删除
QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier, QString());
QApplication::sendEvent(currentWidget, &keyPress);
} else if (type == 3) {
//插入回车符
QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier, QString(\n));
QApplication::sendEvent(currentWidget, &keyPress);
} else if (type == 4) {
//插入字符
QKeyEvent keyPress(QEvent::KeyPress, 0, Qt::NoModifier, QString(text));
QApplication::sendEvent(currentWidget, &keyPress);
}
}

bool frmInput2019::eventFilter(QObject *watched, QEvent *event)
{
//qDebug() << TIMEMS << watched << event;
if (watched == this) {
//处理自身拖动
QMouseEvent *mouseEvent = static_cast(event);
//按下的时候记住坐标,移动到鼠标松开的位置
if (event->type() == QEvent::MouseButtonPress) {
if (mouseEvent->button() == Qt::LeftButton) {
mousePressed = true;
mousePoint = mouseEvent->globalPos() - this->pos();
return true;
}
} else if (event->type() == QEvent::MouseButtonRelease) {
mousePressed = false;
return true;
} else if (event->type() == QEvent::MouseMove) {
//bottom为固定的底部禁用拖动
if (mousePressed && position != “bottom”) {
this->move(mouseEvent->globalPos() - mousePoint);
this->update();
return true;
}
}
} else if (watched == ui->labMore) {
//打开更多汉字候选面板
if (event->type() == QEvent::MouseButtonPress) {

           }
} else if (watched == ui->labType) {
    //中英模式切换,由于采用的标签所以在这里处理
    if (event->type() == QEvent::MouseButtonPress) {
        setInputType(inputType == "english" ? "chinese" : "english");
    }
} else if (watched == ui->labType2) {
    //固定切换到英文模式
    if (event->type() == QEvent::MouseButtonPress) {
        setInputType("english");
    }
} else if (watched == ui->widgetCn) {
    //没有汉字或者按下的地方没有汉字或者当前汉字标签个数过少都不用继续
    if (pinyinHelper.getCount() == 0 || lastText.isEmpty()) {
        return false;
    }

    //记住最后按下拖动的时间,过短则认为是滑动,启动滑动动画
    //static bool pressed = false;
    static QPoint lastPos = QPoint();
    static QDateTime lastTime = QDateTime::currentDateTime();
    QMouseEvent *mouseEvent = static_cast(event);

    if (event->type() == QEvent::MouseButtonPress) {
        
    } else if (event->type() == QEvent::MouseMove) {  
    }
} else if (watched == ui->widgetMore) {
    //没有汉字或者按下的地方没有汉字或者当前汉字标签个数过少都不用继续
    if (pinyinHelper.getCount() == 0 || lastText.isEmpty()) {
        return false;      }

    //记住最后按下拖动的时间,过短则认为是滑动,启动滑动动画

    QMouseEvent *mouseEvent = static_cast(event);

    if (event->type() == QEvent::MouseButtonPress) {

    } else if (event->type() == QEvent::MouseButtonRelease) {

        }
    } else if (event->type() == QEvent::MouseMove) {

            return true;
        }
    }
} else if (watched->inherits("QLabel")) {
    //单击的是汉字标签
    QLabel *lab = (QLabel *)watched;

    //2022-1-7增加硬键盘模式下单击汉字标签选中
    if (useHardKeyBoard && event->type() == QEvent::MouseButtonPress) {

        return true;
    }

    if (!upper && inputType == "chinese") {
        if (lab->property("labCn").toBool()) {
            //记住最后按下的滚动条位置,如果滚动条一直没有变化则认为单击了标签
            static int lastPosition = 0;
            if (event->type() == QEvent::MouseButtonPress) {
                  } else if (event->type() == QEvent::MouseButtonRelease) {                 
            if (event->type() == QEvent::MouseButtonPress) {
   
            } else if (event->type() == QEvent::MouseButtonRelease) {      

    } else if (event->type() == QEvent::RequestSoftwareInputPanel) {
        showPanel();
    } else if (event->type() == QEvent::CloseSoftwareInputPanel) {
        hidePanel();
    }
}
return QWidget::eventFilter(watched, event);

}


事件过滤

#include eventfilter.h
#include
#include
#include
#include

EventFilter::EventFilter(QWidget *parent,Qt::WindowFlags f)
QDialog(parent,f)
{
setWindowTitle(tr(事件过滤));
label1 = new QLabel;
Image1.load(…/image/1.png);
label1->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
label1->setPixmap(QPixmap::fromImage(Image1));
label2 = new QLabel;
Image2.load(../image/2.png);
label2->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
label2->setPixmap(QPixmap::fromImage(Image2));

label3 = new QLabel;
Image3.load(../image/3.png);
label3->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
label3->setPixmap(QPixmap::fromImage(Image3));

stateLabel = new QLabel(tr(鼠标按下标志));
stateLabel->setAlignment(Qt::AlignHCenter);
QHBoxLayout *layout=new QHBoxLayout;
layout->addWidget(label1);
layout->addWidget(label2);
layout->addWidget(label3);

QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addLayout(layout);
mainLayout->addWidget(stateLabel);

label1->installEventFilter(this);
label2->installEventFilter(this);
label3->installEventFilter(this);

}

EventFilter::~EventFilter()
{

}

bool EventFilter::eventFilter(QObject *watched, QEvent *event)
{
if(watched==label1)
{
if(event->type()==QEvent::MouseButtonPress)
{
QMouseEvent *mouseEvent=(QMouseEvent *)event;
if(mouseEvent->buttons()&Qt::LeftButton)
{
stateLabel->setText(tr(左键按下左边图片));
}
else if(mouseEvent->buttons()&Qt::MidButton)
{
stateLabel->setText(tr(中键按下左边图片));
}
else if(mouseEvent->buttons()&Qt::RightButton)
{
stateLabel->setText(tr(右键按下左边图片));
}

        QMatrix matrix;
        matrix.scale(1.8,1.8);
        QImage tmpImg=Image1.transformed(matrix);
        label1->setPixmap(QPixmap::fromImage(tmpImg));
    }
    if(event->type()==QEvent::MouseButtonRelease)
    {
        stateLabel->setText(tr(鼠标释放左边图片));
        label1->setPixmap(QPixmap::fromImage(Image1));
    }
}
else if(watched==label2)
{
    if(event->type()==QEvent::MouseButtonPress)
    {
        QMouseEvent *mouseEvent=(QMouseEvent *)event;
        if(mouseEvent->buttons()&Qt::LeftButton)
        {
            stateLabel->setText(tr(左键按下中间图片));
        }
        else if(mouseEvent->buttons()&Qt::MidButton)
        {
            stateLabel->setText(tr(中键按下中间图片));
        }
        else if(mouseEvent->buttons()&Qt::RightButton)
        {
            stateLabel->setText(tr(右键按下中间图片));
        }

        QMatrix matrix;
        matrix.scale(1.8,1.8);
        QImage tmpImg=Image2.transformed(matrix);
        label2->setPixmap(QPixmap::fromImage(tmpImg));
    }
    if(event->type()==QEvent::MouseButtonRelease)
    {
        stateLabel->setText(tr(鼠标释放中间图片));
        label2->setPixmap(QPixmap::fromImage(Image2));
    }
}
else if(watched==label3)
{
    if(event->type()==QEvent::MouseButtonPress)
    {
        QMouseEvent *mouseEvent=(QMouseEvent *)event;
        if(mouseEvent->buttons()&Qt::LeftButton)
        {
            stateLabel->setText(tr(左键按下右边图片));
        }
        else if(mouseEvent->buttons()&Qt::MidButton)
        {
            stateLabel->setText(tr(中键按下右边图片));
        }
        else if(mouseEvent->buttons()&Qt::RightButton)
        {
            stateLabel->setText(tr(右键按下右边图片));
        }

        QMatrix matrix;
        matrix.scale(1.8,1.8);
        QImage tmpImg=Image3.transformed(matrix);
        label3->setPixmap(QPixmap::fromImage(tmpImg));
    }
    if(event->type()==QEvent::MouseButtonRelease)
    {
        stateLabel->setText(tr(鼠标释放右边图片));
        label3->setPixmap(QPixmap::fromImage(Image3));
    }
}
return QDialog::eventFilter(watched,event);

}


鼠标事件

#include mouseevent.h

MouseEvent::MouseEvent(QWidget *parent)
QMainWindow(parent)
{
setWindowTitle(tr(鼠标事件));
statusLabel = new QLabel;
statusLabel->setText(tr(当前位置:));
statusLabel->setFixedWidth(100);
MousePosLabel = new QLabel;
MousePosLabel->setText(tr());
MousePosLabel->setFixedWidth(100);
statusBar()->addPermanentWidget(statusLabel);
statusBar()->addPermanentWidget(MousePosLabel);
this->setMouseTracking(true);
resize(400,200);
}

MouseEvent::~MouseEvent()
{

}

void MouseEvent::mousePressEvent(QMouseEvent *e)
{
QString str=(+QString::number(e->x())+,+QString::number(e->y())+);
if(e->button()==Qt::LeftButton)
{
statusBar()->showMessage(tr(左键:)+str);
}
else if(e->button()==Qt::RightButton)
{
statusBar()->showMessage(tr(右键:)+str);
}
else if(e->button()==Qt::MidButton)
{
statusBar()->showMessage(tr(中键:)+str);
}
}

void MouseEvent::mouseMoveEvent(QMouseEvent *e)
{
MousePosLabel->setText((+QString::number(e->x())+, +QString::number(e->y())+));
}

void MouseEvent::mouseReleaseEvent(QMouseEvent *e)
{
QString str=(+QString::number(e->x())+,+QString::number(e->y())+);
statusBar()->showMessage(tr(释放在:)+str,3000);
}

void MouseEvent::mouseDoubleClickEvent(QMouseEvent *e){}

■ MainWindow

/* 设置宽高为800×480,位置在0, 0。(0, 0)代表原点,Qt默认最左上角的点为原点 /
this->setGeometry(0, 0, 800, 480);
this->resize(800,480);
/
设置主窗口的样式1 /
this->setStyleSheet(“QMainWindow { background-color: rgba(255, 245, 238, 100%); }”);
/
设置主窗口的样式2 /
this->setStyleSheet(“QMainWindow { background-color: rgba(238, 122, 233, 100%); }”);
this->close();
/
设置窗体不透明度,范围是0.0~1.0。1则为不透明,0为全透明 */
this->setWindowOpacity(dobleopacity);

■ QApplication

/* 实例化QStyle类对象,用于设置风格,调用系统类自带的图标 */
QStyle style = QApplication::style();
/
使用Qt自带的标准图标,可以在帮助文档里搜索QStyle::StandardPixmap */
QIcon icon = style->standardIcon(QStyle::SP_TitleBarContextHelpButton);

■ 信号槽

GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。
SIGNAL 和 SLOT 是 Qt 的宏,用于指明信号和槽,并将它们的参数转换为相应的字符串。
一个信号可以连接多个槽,
connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(addFun(int));
connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(updateStatus(int));

多个信号可以连接同一个槽,
connect(ui->rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
connect(ui->rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
connect(ui->rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor()));

一个信号可以连接另外一个信号
connect(spinNum, SIGNAL(valueChanged(int)), this, SIGNAL (refreshInfo(int));

严格的情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误。
在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT。
当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。
/* 设定两个QPushButton对象的位置 */
pushButton1->setGeometry(300,200,80,40);
pushButton2->setGeometry(400,200,80,40);

/* 信号槽连接 */
connect(pushButton1, SIGNAL(clicked()), this, SLOT(pushButton1_Clicked()));
connect(pushButton2, SIGNAL(clicked()), this, SLOT(pushButton2_Clicked()));

connect(sndTimer,&QTimer::timeout,[=](){
    updateQStringList();
    emit edit_textChanged(getstep().toInt(),m_stlist);
});

■ qsrand

/* 设置随机种子,随机数初始化 /
// qsrand(time(NULL));
/
产生随机0~100之间的数据 */
// qrand() %100;


■ 水平、垂直策略 (窗口控件的大小控制)

要想在布局时和主窗口大小改变时控制控件的大小,QWidget里有一些方法如下:

  • sizeHint:这个属性所保存的QSize的值是一个推荐这个窗体尺寸的一个值,sizeHint() 函数会返回这个推荐值
  • minimumSizeHint:与sizeHint一样,只不过这个属性保存的是推荐这个窗体最小尺寸的一个值
  • minimumSize和maximumSize:这2个属性保存的是窗体的最小尺寸和最大尺寸,窗体的尺寸被限制在这2个尺寸之间,可以自己设置。
  • sizePolicy:这个属性用于设置窗体在 水平/垂直 方向上的伸展属性,在窗体没有被布局的情况下是不起作用的,QSizePolicy::Policy 枚举值有如下几个:

属性值描述QSizePolicy::Fixedwidget 的实际尺寸只 参考 sizeHint() 的返回值,当主窗口在水平/垂直方向上大小改变时它不能随之变化QSizePolicy::Minimum可以随主窗口伸展收缩,不过widget尺寸不能小于sizeHint()QSizePolicy::Maximum可以随主窗口伸展收缩,不过widget尺寸不能大于sizeHint()QSizePolicy::Preferred可以随主窗口伸展收缩,但在争夺空白空间上没有优势QSizePolicy::Expanding可以随主窗口伸展收缩,在布局时它会尽可能多地去获取额外的空间,也就是比 Preferred 更具优势QSizePolicy::MinimumExpanding可以随主窗口伸展收缩,不过widget尺寸不能小于sizeHint(),同时它比 Preferred 更具优势去获取额外空间QSizePolicy::Ignored忽略 sizeHint() 的作用


■ border

color:rgb(255, 255, 255);
border: 1px solid gray;
border-style:solid;
border-radius:5px;
border-top-left-radius:2px;
border-top-right-radius:2px;
border-bottom-left-radius: 20px;
border-bottom-right-radius: 20px;
border-top-left-radius:2px;
border-top-right-radius:2px;

border:0px;
border-left:1px solid rgba(82,130,164,1);
border-right:1px solid rgba(82,130,164,1);
border-top:1px solid rgba(82,130,164,1);
border-bottom:1px solid rgba(82,130,164,1);

background:rgba(17,24,47,1);
border:0px;
border-left:1px solid rgba(82,130,164,1);
border-right:1px solid rgba(82,130,164,1);
border-top:1px solid rgba(82,130,164,1);}"
border-bottom:1px solid rgba(82,130,164,1);

QLabel

/* 使用资源里的文件时格式是 :+前缀+文件路径 /
QPixmap pixmap(“:images/openedv.png”);
labelImage = new QLabel(this);
/
标签大小为452×132,根据图像的大小来设置 /
labelImage->setGeometry(180, 150, 452, 132);
/
设置图像 /
labelImage->setPixmap(pixmap);
/
开启允许缩放填充 */
labelImage->setScaledContents(true);
labelString = new QLabel(this);
labelString->setText(“标签演示文本”);
labelString->setGeometry(300, 300, 100, 20);

Qss

QLabel{
color: rgb(255, 255, 255);
}
label->setFrameShape (QFrame::Box);
label->setStyleSheet(“border-width: 1px;border-style: solid;border-color: rgb(255, 170, 0);”);
setStyleSheet(“QLabel{border:2px solid rgb(200, 200, 200);}”);

font: bold; 是否粗体显示
font-family:“”; 来设定字体所属家族,
font-size:20px; 来设定字体大小
font-style: nomal; 来设定字体样式
font-weight:20px; 来设定字体深浅
color:black ;字体颜色

border: 1px solid gray;边框大小,样式,颜色
border-image:“”; 用来设定边框的背景图片。
border-radius:5px; 用来设定边框的弧度。可以设定圆角的按钮
border-width: 1px; 边框大小

background-color: green; 设置背景颜色
background:transparent; 设置背景为透明
color:rgb(241, 70, 62); 设置前景颜色
selection-color:rgb(241, 70, 62); 用来设定选中时候的颜色

显示动画

可以使用QLabel 的成员函数setMovie加载动画,可以播放gif格式的文件:void setMovie(QMovie * movie),需要加入头文件。
QLabel label = new QLabel;
/
定义QMovied对象,并初始化 */
QMovie movie = new QMovie(“:/ssss/C:/Users/wangmumu/Desktop/timg.gif”);
/
播放加载的动画 /
movie->start();
/
将动画设置到QLabel中 /
label->setMovie(movie);
/
设置动画大小自适应 */
label->setScaledContents(true);


■ QFrame

QFrame *frame = new QFrame;
frame->resize(400,700);
QPixmap pixmap(“:/images/frame.png”);//设定图片
frame->setPalette(palette);//设置窗口调色板为palette,窗口和画笔相关联
frame->setMask(pixmap.mask()); //可以将图片中透明部分显示为透明的
frame->setAutoFillBackground(true);//设置窗体自动填充背景
frame->show();

■ 去除弹框背景圆角

dialog->setModal(true); //父窗口不能点击。
setWindowFlag(Qt::FramelessWindowHint); // 设置去除标题栏 无框窗提示

QFrame 支持圆角设置风格

有白色的角
setAttribute(Qt::WA_TranslucentBackground); //设置背景透明;


■ QWidget

vWidget[i] = new QWidget();
vWidget[i]->setAutoFillBackground(true);
该函数用于设置当窗口作为被包含窗口时, 是否需要绘制背景。
注意:QT窗口系统默认状态下, 当一个窗口作为被包含窗口时, 其不再绘制背景, 即使指定了背景绘制参数(如背景颜色、背景图片等)。

QWidget{
background-color: rgb(255, 170, 127);
}
//设置widget边框 这个设置会影响Widget上的子控件
ui->widget->setStyleSheet(QString::fromUtf8(“border:3px solid blue”));
//设置widget_2边框
ui->widget->setStyleSheet(QString::fromUtf8(“#widget_2{border:3px solid red}”));

background-color: rgb(52, 57, 71);
border-bottom-left-radius: 20px;


■ QGridLayout

MainWindow::MainWindow(QWidget parent) : QMainWindow(parent)
{
/
设置位置与大小 /
this->setGeometry(0, 0, 800, 480);
/
实例化 /
gWidget = new QWidget(this);
/
设置gWidget居中央 /
this->setCentralWidget(gWidget);
gridLayout = new QGridLayout();
/
QList链表,字符串类型 /
QList list;
list<<“按钮1”<<“按钮2”<<“按钮3”<<“按钮4”;
for (int i = 0; i < 4; i++){
pushButton[i] = new QPushButton();
pushButton[i]->setText(list[i]);
/
设置最小宽度与高度 /
pushButton[i]->setMinimumSize(100, 30);
/
自动调整按钮的大小 /
pushButton[i]->setSizePolicy(
QSizePolicy::Expanding,
QSizePolicy::Expanding
);
switch (i) {
case 0:
/
将pushButton[0]添加至网格的坐标(0,0),下同 /
gridLayout->addWidget(pushButton[i], 0, 0);
break;
case 1:
gridLayout->addWidget(pushButton[i], 0, 1);
break;
case 2:
gridLayout->addWidget(pushButton[i], 1, 0);
break;
case 3:
gridLayout->addWidget(pushButton[i], 1, 1);
break;
default:
break;
}
}
/
设置第0行与第1行的行比例系数 */
gridLayout->setRowStretch(0, 2);
gridLayout->setRowStretch(1, 3);

/* 设置第0列与第1列的列比例系数 */
gridLayout->setColumnStretch(0, 1);
gridLayout->setColumnStretch(1, 3);

/* 将gridLayout设置到gWidget */
gWidget->setLayout(gridLayout);

}

■ QFormLayout

/* 设置位置与大小 /
this->setGeometry(0, 0, 800, 480);
/
实例化及设置位置与大小,下同 /
fWidget = new QWidget(this);
fWidget->setGeometry(250, 100, 300, 200);
userLineEdit = new QLineEdit();
passwordLineEdit = new QLineEdit();
formLayout = new QFormLayout();
/
添加行 /
formLayout->addRow("用户名: ", userLineEdit);
formLayout->addRow(“密码 :”, passwordLineEdit);
/
设置水平垂直间距 /
formLayout->setSpacing(10);
/
设置布局外框的宽度 /
formLayout->setMargin(20);
/
将formLayout布局到fWidget */
fWidget->setLayout(formLayout);


■ QButtonGroup

/互斥按钮组/
ui->buttonGroup->setId(ui->radioButton_not,0);
ui->buttonGroup->setId(ui->radioButton_net,1);
ui->buttonGroup->setId(ui->radioButton_wifi,2);
ui->buttonGroup->setId(ui->radioButton_bt,3);
ui->buttonGroup->setExclusive(true); //设置这个按钮组为互斥模式
connect(ui->buttonGroup, SIGNAL(buttonClicked(int)), this, SLOT(slot_btnGroupClicked(int)));

//设置按钮选中
int nSelectBtn = 1;
QPushButton btn = qobject_cast> (buttonGroup->button(nSelectBtn));
btn->setChecked(true);

int nSelectBtn = index;
QRadioButton btn = qobject_cast> (ui->buttonGroup->button(nSelectBtn));
btn->setChecked(true);

■ QTableView

MainWindow::MainWindow(QWidget *parent)
QMainWindow(parent)
{
/* 设置窗口的位置与大小 /
this->setGeometry(0, 0, 800, 480);
tableView = new QTableView(this);
setCentralWidget(tableView);
/
显示网格线 */
tableView->setShowGrid(false); //true
QStandardItemModel* model = new QStandardItemModel();
QStringList labels =
        QObject::tr("语文,数学,英语,物理").simplified().split(",");
/* 设置水平头标签 */
model->setHorizontalHeaderLabels(labels);

/* item */
QStandardItem* item = 0;
/* model插入项内容 */
for(int i = 0; i < 5; i++){
    item = new QStandardItem("80");
    model->setItem(i, 0, item);
    item = new QStandardItem("99");
    model->setItem(i, 1, item);
    item = new QStandardItem("100");
    model->setItem(i, 2, item);
}
/* 将model设置给tableView */
tableView->setModel(model);
/* 平均分列 */
tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
/* 平均分行 */
tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);

tableView->setFocusPolicy(Qt::NoFocus); // 取消Item选中后的虚线边框

tableView->verticalHeader()->setHidden(true); // 隐藏默认行号

// tableView->setSelectionBehavior(QAbstractItemView::SelectRows); // 设置选中一整行
tableView->setSelectionMode (QAbstractItemView::SingleSelection); // 只允许选中单行
}

取消Item选中后的虚线边框
tableView->setFocusPolicy(Qt::NoFocus); // 取消Item选中后的虚线边框


■ QColumnView

#include “mainwindow.h”
#include
MainWindow::MainWindow(QWidget parent)
: QMainWindow(parent)
{
/
设置主窗体显示位置与大小 */
this->setGeometry(0, 0, 800, 480);
QStandardItemModel model = new QStandardItemModel;
/
省份 */
QStandardItem province = new QStandardItem(“广东省”);
/
城市 */
QStandardItem *city1 = new QStandardItem(“茂名市”);
QStandardItem city2 = new QStandardItem(“中山市”);
/
添加城市到省份下 */
province->appendRow(city1);
province->appendRow(city2);
QStandardItem *town1 = new QStandardItem(“电白镇”);
QStandardItem town2 = new QStandardItem(“南头镇”);
/
添加城镇到城市下 /
city1->appendRow(town1);
city2->appendRow(town2);
columnView = new QColumnView;
/
建立model /
model->appendRow(province);
/
设置model /
columnView->setModel(model);
/
设置居中 */
setCentralWidget(columnView);
}
MainWindow::~MainWindow()
{
}


■ QTreeView

MainWindow::MainWindow(QWidget *parent)
QMainWindow(parent)
{
/* 设置窗口的位置与大小 /
this->setGeometry(0, 0, 800, 480);
/
实例化QTreeView对象 /
treeView = new QTreeView(this);
/
居中 */
setCentralWidget(treeView);
/* 构建Model */
QStandardItemModel *sdiModel = new QStandardItemModel(treeView);
sdiModel->setHorizontalHeaderLabels(
            QStringList()< items1;
    QStandardItem* item1 =
            new QStandardItem(QString::number(i));
    QStandardItem* item2 =
            new QStandardItem(QStringLiteral("一级标题"));
    /* 添加项一 */
    items1.append(item1);
    /* 添加项二 */
    items1.append(item2);
    /* appendRow方法添加到model上 */
    sdiModel->appendRow(items1);


    for(int j = 0; j < 5; j++) {
        /* 在一级标题后面插入二级标题 */
        QList items2;
        QStandardItem* item3 =
                new QStandardItem(QString::number(j));
        QStandardItem* item4 =
                new QStandardItem(QStringLiteral("二级标题"));
        items2.append(item3);
        items2.append(item4);
        /* 使用appendRow方法添加到item1上 */
        item1->appendRow(items2);
    }
}
/* 设置Model给treeView */
treeView->setModel(sdiModel);

}
MainWindow::~MainWindow()
{
}



■ QTabBar

#基本样式设置
QTabBar::tab{
font: 75 12pt “Arial”; #设置字体
width:84px; #设置宽度
height:30; #设置高度
margin-top:5px; #设置边距
margin-right:1px;
margin-left:1px;
margin-bottom:0px;
}

#最左边标签未选中时显示(因为需要左边打圆角,所以和其他背景图片不一样,注意字体颜色)
QTabBar::tab:first:!selected {
color:#000000;
border-image: url(:/common/images/common/左_normal.png);
}
#最左边标签被选中
QTabBar::tab:first:selected {
color:#FFFFFF;
border-image: url(:/common/images/common/左_pressed.png);
}
#最右边标签未选中时显示(因为需要右边打圆角,所以和其他背景图片不一样)
QTabBar::tab:last:!selected {
color:#000000;
border-image: url(:/common/images/common/右_normal.png);
}
#最右边标签被选中
QTabBar::tab:last:selected {
color:#FFFFFF;
border-image: url(:/common/images/common/右_pressed.png);
}
#中间的标签未被选择的显示
QTabBar::tab:!selected {
color:#000000;
border-image: url(:/common/images/common/中_normal.png);
}
#中间标签选中显示的图片
QTabBar::tab:selected {
color:#FFFFFF;
border-image: url(:/common/images/common/中_pressed.png);
}

tab标签居中显示
QTabWidget::tab-bar {
alignment: center;
}

5 鼠标停留tab标签的效果
鼠标放在标签上,可设置标签颜色或者背景图片
QTabBar::tab:hover{
background:rgb(255, 255, 255, 100);
}
6 去掉tabwidget的widget边框
QTabWidget::pane{
border:none;
}

QTabBar::tab{
background-color: rgb(255, 255, 255);
}

QTabBar::tab:hover{
background:rgb(46, 207, 38, 100);
}

QTabBar::tab:selected {
background:rgb(25, 34, 231, 100);
}

QTabWidget:pane{
border: 1px solid red;
top: -1px;
background-color:grey;
}

QTabBar::tab{
height:22px; background-color:grey; margin-right: 2px; margin-bottom:-2px;
}

QTabBar::tab:selected{
border:1px solid red;border-bottom-color: none;
}

QTabBar::tab:!selected{
border-bottom: 3px solid red;
}
实现的效果如图所示:



■ QTabWidget

MainWindow::MainWindow(QWidget *parent)
QMainWindow(parent)
{
this->setGeometry(0, 0, 800, 480);
widget = new QWidget(this);
/* 居中 /
this->setCentralWidget(widget);
/
多页面小部件 /
tabWidget = new QTabWidget();
/
水平布局实例化 /
hBoxLayout = new QHBoxLayout();
QList strLabelList;
strLabelList<<“标签一”<<“标签二”<<“标签三”;
QList strTabList;
strTabList<<“页面一”<<“页面二”<<“页面三”;
QList iconList;
iconList<<“:/icons/icon1”
<<“:/icons/icon2”
<<“:/icons/icon3”;
for (int i = 0; i < 3; i++) {
label[i] = new QLabel();
/
设置标签文本 /
label[i]->setText(strLabelList[i]);
/
标签对齐方式(居中) /
label[i]->setAlignment(Qt::AlignCenter);
/
添加页面 /
tabWidget->addTab(label[i],
QIcon(iconList[i]),
strTabList[i]
);
}
/
是否添加关闭按钮 /
//tabWidget->setTabsClosable(true);
/
将tabWidget水平直排布 /
hBoxLayout->addWidget(tabWidget);
/
将垂直布局设置到widget */
widget->setLayout(hBoxLayout);
}
MainWindow::~MainWindow()
{
}

■ QTableWidget

MainWindow::MainWindow(QWidget *parent)
QMainWindow(parent)
{
/* 设置主窗体的大小与位置 */
this->setGeometry(0, 0, 800, 480);
/* 实例化 */
tableWidget = new QTableWidget(this);
/* 设置tableWidget表居中 */
setCentralWidget(tableWidget);
/* 设置列数 */
tableWidget->setColumnCount(2);
/* 设置行数 */
tableWidget->setRowCount(2);
/* 使用标签设置水平标题标签 */
tableWidget->setHorizontalHeaderLabels(
            QStringList()<<"姓名"<<"性别"
            );


/* 字符串类型链表 */
QList  strList;
strList<<"小明"<<"小红"<<"男"<<"女";


for (int i = 0; i < 4; i++) {
    /* 实例化 */
    tableWidgetItem[i] = new QTableWidgetItem(strList[i]);
    /* 设置文本居中对齐 */
    tableWidgetItem[i]->setTextAlignment(Qt::AlignCenter);
}
/* 插入数据,表的index就是一个二维数组数据 */
tableWidget->setItem(0, 0, tableWidgetItem[0]);
tableWidget->setItem(1, 0, tableWidgetItem[1]);
tableWidget->setItem(0, 1, tableWidgetItem[2]);
tableWidget->setItem(1, 1, tableWidgetItem[3]);

}
MainWindow::~MainWindow()
{
}


■ QListWidget

//添加
void ProManageEdit::add(QStringList stlist)
{
QListWidgetItem item0 = new QListWidgetItem;
ListManagEdit * editWidget = new ListManagEdit(this);
editWidget->update(stlist);
connect(editWidget,SIGNAL(edit_textChanged(int,QStringList)),this,SLOT(slots_edit_textChangedHandle(int,QStringList)));
ui->listWidget->addItem(item0);
ui->listWidget->setItemWidget(item0,editWidget);
}
//删除
void ProManageEdit::deleteStep(int step)
{
auto editWidget = dynamic_cast>(ui->listWidget->itemWidget(ui->listWidget->item(step)));
disconnect(editWidget,SIGNAL(edit_textChanged(int,QStringList)),this,SLOT(slots_edit_textChangedHandle(int,QStringList)));
ui->listWidget->removeItemWidget(ui->listWidget->item(step));
}

//修改数据 或者交换
void ProManageEdit::swap(int fromstep, QStringList fromstlist, int tostep, QStringList tostlist)
{
QListWidgetItem* fromitem = ui->listWidget->item(fromstep);
QListWidgetItem* toitem = ui->listWidget->item(tostep);

auto fromTest = dynamic_cast(ui->listWidget->itemWidget(fromitem));
auto toTest = dynamic_cast(ui->listWidget->itemWidget(toitem));

fromTest->update(tostlist);
toTest->update(fromstlist);
}
listWidget->item(i)->setTextColor(QColor(22, 22, 22, 225));

ui->listWidget->setSpacing(5); // 设置边距离
设置每个QListWidgetItem 之间的距离

QListWidget 对不齐问题,是因为进度条导致的
解决办法是/屏蔽垂直滚动条 ui->listWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //屏蔽垂直滚动条

style.qss

QListWidget {
font-size: 30px;
outline:none;
}

QListWidget::item:active {
background: transparent;
}

QListWidget::item {
height:80;
}

QListWidget::item:selected:hover {
background:#22222222;
}

QListWidget::item:selected {
background:transparent;
color:#ee222222;
}

1、首先是实现插入项的功能,也就是新增一项
void Widget::on_InsertBtn_clicked()
{
//首先是获取项的总数
int itemCount = ui->listWidget->count();

//new一个空的子项
QListWidgetItem * item = new QListWidgetItem;
//初始化空的子项,比如设置颜色,高度,内容等等
//设置大小
item->setSizeHint(QSize(ui->listWidget->width(),50));
//设置内容
item->setText(QString("自定义子项%1").arg(itemCount));
//设置属性
item->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled|Qt::ItemIsUserCheckable);//双击可被编辑,可选中
item->setCheckState(Qt::Unchecked);//默认 不选中状态

//最后将初始化好的子项插入到listWidget控件中
ui->listWidget->addItem(item);

}

2、删除项,删除当前选中的项,代码如下:
void Widget::on_DelBtn_clicked()
{
//先判断当前是否选中,如果没有选中则提示
if(!ui->listWidget->currentItem()){
QMessageBox::warning(this,“警告”,“请先选中当前项再进行删除!”);
return;
}

//获取当前想要删除的子项
QListWidgetItem * delItem = ui->listWidget->takeItem(ui->listWidget->currentRow());
if(delItem)//注意需要手动删除
    delete delItem;

}

3、清空列表,调用clear()函数即可。
void Widget::on_ClearBtn_clicked()
{
ui->listWidget->clear();
}
4、状态栏的显示
void Widget::on_listWidget_currentRowChanged(int currentRow)
{
//如果没有子项,直接退出
if(currentRow<0)
return;

//获取当前项
QListWidgetItem *curItem = ui->listWidget->currentItem();
//获取内容
QString curText = curItem->text();
//在状态栏进行显示内容和选中状态
QString stateText;
stateText = (QString("当前选中第%1项:").arg(currentRow)+curText);
if(curItem->checkState() == Qt::Checked)
    stateText += "  选中";
else
    stateText += "  没有选中";

ui->StateLabel->setText(stateText);

}
5、排序
ui->listWidget->setSortingEnabled(true);//生效排序
ui->listWidget->sortItems(Qt::DescendingOrder); //降序

6、显示方式
ui->listWidget->setViewMode(QListView::IconMode);

7、初始化
void Widget::InitListwidget()
{
//自定义菜单策略
ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
//设置视图显示方式为图标模式(图标在上,文字在下)
ui->listWidget->setViewMode(QListView::IconMode);
//设置可以选择多项
ui->listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
//设置背景颜色,使每个子项之间的间距有颜色区别
//ui->listWidget->setStyleSheet(“background:transparent;”);
//设置无边框
ui->listWidget->setFrameShape(QFrame::NoFrame);
//设置子项不能被拖拽
ui->listWidget->setDragEnabled(false);
//设置子项每个图标的大小
ui->listWidget->setIconSize(QSize(200,200));
//设置每个子项的大小固定
ui->listWidget->setUniformItemSizes(true);
//设置QLisView大小改变时,图标的调整模式,默认是固定的,可以改成自动调整
ui->listWidget->setResizeMode(QListView::Adjust);
//设置每个子项之间的间距
ui->listWidget->setSpacing(10);

//设置样式,直接在函数中设置
ui->listWidget->setStyleSheet("QListWidget{border:1px solid gray; color:black;background:transparent;}"
                           "QListWidget::Item{padding-top:20px; padding-bottom:4px; }"
                           "QListWidget::Item:hover{background:skyblue; }"
                           "QListWidget::item:selected{background:lightgray; color:red; }"
                           "QListWidget::item:selected:!active{border-width:0px; background:lightgreen; }"
                           );

}

注意点:
int n=ui->listWidget->count();//获取item的总数
//删去所有item
for(int i=0;i {
/*
使用takeItem(row)函数将QListWidget中的第row个item移除,
移除需要使用delete手动释放其在堆上占用的空间
*/
//这里是0,不是i,因为每移除一个item都会导致每个item的row发生变化
QListWidgetItem *item = ui->listWidget->takeItem(0);
delete item;
}

QListWidgetItem* item = ui->listWidget->currentItem();//被选中或背点击的item删除
// QListWidgetItem* item = ui->listWidget->takeItem(2);//指定删除
ui->listWidget->removeItemWidget(item);
delete item;


■ QStackedWidget

MainWindow::MainWindow(QWidget *parent)
QMainWindow(parent)
{
this->setGeometry(0, 0, 800, 480);
/* widget小部件实例化 /
widget = new QWidget(this);
/
设置居中 /
this->setCentralWidget(widget);
/
垂直布局实例化 /
hBoxLayout = new QHBoxLayout();
/
堆栈部件实例化 /
stackedWidget = new QStackedWidget();
/
列表实例化 /
listWidget = new QListWidget();
QList strListWidgetList;
strListWidgetList<<“窗口一”<<“窗口二”<<“窗口三”;
for (int i = 0; i < 3; i++){
/
listWidget插入项 */
listWidget->insertItem(
i,
strListWidgetList[i]
);
}
QList strLabelList;
strLabelList<<“标签一”<<“标签二”<<“标签三”;
for (int i = 0; i < 3; i++){
    label[i] = new QLabel();
    /* 设置标签文本 */
    label[i]->setText(strLabelList[i]);
    /* 标签对齐方式(居中) */
    label[i]->setAlignment(Qt::AlignCenter);
    /* 添加页面 */
    stackedWidget->addWidget(label[i]);
}

/* 设置列表的最大宽度 */
listWidget->setMaximumWidth(200);
/* 添加到水平布局 */
hBoxLayout->addWidget(listWidget);
hBoxLayout->addWidget(stackedWidget);

/* 将widget的布局设置成hboxLayout */
widget->setLayout(hBoxLayout);

/* 利用listWidget的信号函数currentRowChanged()与
 * 槽函数setCurrentIndex(),进行信号与槽连接
 */
connect(listWidget, SIGNAL(currentRowChanged(int)),
        stackedWidget, SLOT(setCurrentIndex(int)));

}
MainWindow::~MainWindow()
{
}


■ QPushButton

/* 设置主窗口的样式1 /
this->setStyleSheet(QMainWindow { background-color: rgba(255, 245, 238, 100%); });
/
设定两个QPushButton对象的位置 */
pushButton1->setGeometry(300,200,80,40);

pushButton1->setStyleSheet(
            "QPushButton{"                                       // 正常状态样式
            "background-color: rgb(50, 50, 50);"       // 背景色(也可以设置图片)
            "color: white;"                              // 字体颜色
            "font: bold 13px;"                         // 字体: 加粗 大小
            "border-radius: 5px;"                    // 边框圆角半径像素
            "border: 2px solid rgb(50, 50, 50);"       // 边框样式:border-width border-style border-color
            "border-style:outset;"                            // 定义一个3D突出边框,inset与之相反
            "text-align: left;"                 // 文本:左对齐
            "}"

            "QPushButton:hover{"       // 聚焦样式 hover focus
            "background-color:rgb(255, 128, 64);"
            "color: white;"
            "border-radius: 5px;"
            "border: 2px solid white;"
            "border-style:outset;"
            "font:bold 13px;"
            "text-align: left;"
        "}");

QPushButton{
border: 1px solid gray;
color: rgb(255, 255, 255);
background-color: rgb(250, 140, 50);
border-radius:5px;
}
QPushButton:hover{
background-color: rgb(32, 175, 168);
}
QPushButton:pressed{
background-color: rgb(32, 175, 168);
}
QPushButton:disabled{
background-color: rgb(32, 175, 168);
}

style.qss
QPushButton#addAlarm {
border-image:url(:/icons/addalarm1.png);
background:transparent;
outline: none;
}

QPushButton#addAlarm:hover {
border-image:url(:/icons/addalarm2.png);
}

QPushButton#yesButton {
border: 1px solid #22222222;
border-radius: 25px;
background:#22222222;
outline:none;
}

QPushButton#yesButton:pressed {
background:#44222222;
color:white;
}

QPushButton#cancelButton {
border: 1px solid #22222222;
border-radius: 25px;
background:#22222222;
outline:none;
}

QPushButton#cancelButton:pressed {
background:#44222222;
color:white;
}

去除虚线边框:
方法一:

方法二:ui->pushButton->setFocusPolicy(Qt::NoFocus);

方法三:也是通过qss样式表来实现,代码如下所示。
ui->pushButton->setStyleSheet(“padding: -1”);


QPushButton 中添加 buttonGroup组合互斥按钮

ui->buttonGroup->setExclusive(true);//启用互斥

QPushButton{
border: 1px solid gray;
color: rgb(255, 255, 255);
background-color: rgb(38, 42, 53);
border-radius:5px;
}

QPushButton:pressed{
background-color: rgb(32, 175, 168);
}

QPushButton:checked{
background-color: rgb(32, 175, 168);
}
勾选
选中checkable后,Button变成切换按钮(toggle button),可以有两种状态:按下/弹起
默认状况下checkable是不选中的,Button默认为触发按钮(trigger button),按下去马上弹起来


QPushButton 中添加 buttonGroup组合互斥按钮

实现步骤
1、需要创建一个QButtonGroup,然后启用互斥属性
QButtonGroup* btn_group;
btn_group = new QButtonGroup(this);
btn_group->setExclusive(true);//启用互斥
2、创建QPushButton,将按钮的checked启用,然后加入QButtonGroup中。
QPushButton* btn = new QPushButton(this);
btn->setCheckable(true); //将checked功能启用
btn_group->addButton(btn);//添加进QButtonGroup中
3、设置QPushButton的qss样式,按下和没按下的样式
//没按下(正常情况)
QPushButton{
border:1px solid rgb(143,143,143);
background-color:white;
color:black;
}
//按下
QPushButton:checked{
border:1px solid rgb(143,143,143);
background-color:rgb(2,125,180);
color:white;
}

ui->pushButton_Row2_sub->setAutoRepeat(true); //启用长按
ui->pushButton_Row2_sub->setAutoRepeatDelay(400);//触发长按的时间
ui->pushButton_Row2_sub->setAutoRepeatInterval(60);//长按时click信号间隔


■ QToolButton

将QToolButton添加到QButtonGroup中
UI中点击按钮,右键鼠标,添加到指定组中。
设置按钮属性,第一个红框勾选是设置按钮可选,第二个勾选就是设置自动互斥,当同一容器内的按钮勾选了这个选项就会自动互斥

  1. 代码设置
    ui->buttonGroup->setExclusive(true);//启用互斥
    ui->buttonGroup->setId(ui->toolButton_add,0);
    ui->buttonGroup->setId(ui->toolButton_delete,1);
    ui->buttonGroup->setId(ui->toolButton_Next,2);
    ui->buttonGroup->setId(ui->toolButton_Down,3);
    ui->buttonGroup->setId(ui->toolButton_More,4);

样式配置

QToolButton{
color:rgb(255, 255, 255);
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 rgb(226,236,241),
stop: 0.3 rgb(160,160,160),
stop: 1 rgb(140,140,140));
border:1px;
border-radius:5px; /border-radius控制圆角大小/
padding:2px 4px;
}

QToolButton:hover{ /鼠标放上后/
color:rgb(255, 255, 255);
border-style:solid;
border-top-left-radius:2px;
border-top-right-radius:2px;
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 rgb(226,236,241),
stop: 0.3 rgb(160,160,160),
stop: 1 rgb(120,120,120));
border:1px;
border-radius:5px;padding:2px 4px;
}
QToolButton:pressed{ /按下按钮后/
color:rgb(255, 255, 255);

border-style:solid;
border-top-left-radius:2px;
border-top-right-radius:2px;
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 rgb(226,236,241),
stop: 0.3 rgb(190,190,190),
stop: 1 rgb(160,160,160));
border:1px;
border-radius:5px;padding:2px 4px;
}
QToolButton:checked{ /选中后/
color:rgb(255, 255, 255);
border-style:solid;
border-top-left-radius:2px;
border-top-right-radius:2px;
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 rgb(226,236,241),
stop: 0.3 rgb(190,190,190),
stop: 1 rgb(160,160,160));
border:1px;
border-radius:5px;padding:2px 4px;
}
#toolButton {
margin-left:-75px;
padding-left:85px;
background:url(:/image/image/icon.png) center no-repeat;
font-size: 14px;
border: none;
}

#toolButton{
min-width:55px;
min-height:45px;
border:none;
padding-top:50px;
margin-top:-25px;
margin-left:25px;
background:url(:/image/image/icon.png) center no-repeat;
}


■ QButtonGroup


QList rootList;
QTreeWidgetItem *items4 = new QTreeWidgetItem; //添加第一个父节点
items4->setText(0,tr(“数码相机”));
items4->setIcon(0,QIcon(“E:\Qt_Project\QTabWidget\9.ico”));
rootList.append(items4);

/* 实例化QToolButton对象 */

toolButton = new QToolButton();

/* 设置图标 */

toolButton->setIcon(icon);

/* 设置要显示的文本 */

toolButton->setText(“帮助”);

/* 调用setToolButtonStyle()方法,设置toolButoon的样式,设置为文本置于图标下方 */

toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

/* 最后将toolButton添加到ToolBar里 */

toolBar->addWidget(toolButton);


QToolBar

void frmIconHelper::initWidget1()
{
//加入按钮组自动互斥
QButtonGroup *btnGroup = new QButtonGroup(this);
btnGroup->addButton(ui->btn11);
btnGroup->addButton(ui->btn12);
btnGroup->addButton(ui->btn13);
btnGroup->addButton(ui->btn14);

//设置按钮可选中以及图标样式
initBtn(btnGroup, true);
//设置弱属性以便应用样式
ui->widget1->setProperty("flag", "left");


IconHelper::StyleColor styleColor;
styleColor.defaultBorder = true;
styleColor.position = "left";
styleColor.iconSize = 18;
styleColor.iconWidth = 30;
styleColor.iconHeight = 25;
styleColor.borderWidth = 4;
IconHelper::setStyle(ui->widget1, btnGroup->buttons(), icons, styleColor);


//默认选中某个按钮
ui->btn11->click();

}

void frmIconHelper::initWidget2()
{
//加入按钮组自动互斥
QButtonGroup *btnGroup = new QButtonGroup(this);
btnGroup->addButton(ui->btn21);
btnGroup->addButton(ui->btn22);
btnGroup->addButton(ui->btn23);
btnGroup->addButton(ui->btn24);

//设置按钮可选中以及图标样式
initBtn(btnGroup, true);
//设置弱属性以便应用样式
ui->widget2->setProperty("flag", "right");


IconHelper::StyleColor styleColor;
styleColor.defaultBorder = true;
styleColor.position = "right";
styleColor.iconSize = 18;
styleColor.iconWidth = 25;
styleColor.iconHeight = 20;
styleColor.borderWidth = 4;
styleColor.borderColor = "#32B9CF";
styleColor.setColor("#187294", "#B6D7E3", "#145C75", "#F0F0F0");
IconHelper::setStyle(ui->widget2, btnGroup->buttons(), icons, styleColor);


//默认选中某个按钮
ui->btn22->click();

}

void frmIconHelper::initWidget3()
{
//加入按钮组自动互斥
QButtonGroup *btnGroup = new QButtonGroup(this);
btnGroup->addButton(ui->btn31);
btnGroup->addButton(ui->btn32);
btnGroup->addButton(ui->btn33);
btnGroup->addButton(ui->btn34);

//设置按钮可选中以及图标样式
initBtn(btnGroup, false);
//设置弱属性以便应用样式
ui->widget3->setProperty("flag", "left");


IconHelper::StyleColor styleColor;
styleColor.position = "left";
styleColor.iconSize = 30;
styleColor.iconWidth = 40;
styleColor.iconHeight = 40;
styleColor.borderWidth = 3;
styleColor.borderColor = "#609EE9";
IconHelper::setStyle(ui->widget3, btnGroup->buttons(), icons, styleColor);


//默认选中某个按钮
ui->btn33->click();

}

void frmIconHelper::initWidget4()
{
//加入按钮组自动互斥
QButtonGroup *btnGroup = new QButtonGroup(this);
btnGroup->addButton(ui->btn41);
btnGroup->addButton(ui->btn42);
btnGroup->addButton(ui->btn43);
btnGroup->addButton(ui->btn44);

//设置按钮可选中以及图标样式
initBtn(btnGroup, false);
//设置弱属性以便应用样式
ui->widget4->setProperty("flag", "right");


IconHelper::StyleColor styleColor;
styleColor.position = "right";
styleColor.iconSize = 30;
styleColor.iconWidth = 40;
styleColor.iconHeight = 40;
styleColor.borderWidth = 3;
styleColor.borderColor = "#F7AE13";
styleColor.setColor("#FCDC97", "#54626F", "#FFF0BC", "#54626F");
IconHelper::setStyle(ui->widget4, btnGroup->buttons(), icons, styleColor);


//默认选中某个按钮
ui->btn44->click();

}

void frmIconHelper::initWidget5()
{
//加入按钮组自动互斥
QButtonGroup *btnGroup = new QButtonGroup(this);
btnGroup->addButton(ui->btn51);
btnGroup->addButton(ui->btn52);
btnGroup->addButton(ui->btn53);
btnGroup->addButton(ui->btn54);

//设置按钮可选中以及图标样式
initBtn(btnGroup, false);
//设置弱属性以便应用样式
ui->widget5->setProperty("flag", "top");


//设置整体按钮组样式
IconHelper::StyleColor styleColor;
styleColor.defaultBorder = true;
styleColor.position = "top";
styleColor.iconSize = 25;
styleColor.iconWidth = 25;
styleColor.iconHeight = 25;
styleColor.borderWidth = 3;
IconHelper::setStyle(ui->widget5, btnGroup->buttons(), icons, styleColor);


//默认选中某个按钮
ui->btn51->click();

}

void frmIconHelper::initWidget6()
{
//加入按钮组自动互斥
QButtonGroup *btnGroup = new QButtonGroup(this);
btnGroup->addButton(ui->btn61);
btnGroup->addButton(ui->btn62);
btnGroup->addButton(ui->btn63);
btnGroup->addButton(ui->btn64);

//设置按钮可选中以及图标样式
initBtn(btnGroup, false);
//设置弱属性以便应用样式
ui->widget6->setProperty("flag", "bottom");


//设置整体按钮组样式
IconHelper::StyleColor styleColor;
styleColor.defaultBorder = true;
styleColor.position = "bottom";
styleColor.iconSize = 25;
styleColor.iconWidth = 25;
styleColor.iconHeight = 25;
styleColor.borderWidth = 3;
styleColor.borderColor = "#A279C5";
styleColor.setColor("#292929", "#B6D7E3", "#10689A", "#F0F0F0");
IconHelper::setStyle(ui->widget6, btnGroup->buttons(), icons, styleColor);


//默认选中某个按钮
ui->btn63->click();

}
void frmIconHelper::initBtn(QButtonGroup *btnGroup, bool textBesideIcon)
{
QList btns = btnGroup->buttons();
foreach (QAbstractButton *btn, btns) {
QToolButton *b = (QToolButton *)btn;
//关联按钮单击事件
connect(b, SIGNAL(clicked(bool)), this, SLOT(btnClicked()));
b->setCheckable(true);
b->setToolButtonStyle(textBesideIcon ? Qt::ToolButtonTextBesideIcon : Qt::ToolButtonTextUnderIcon);
}
}



■ QRadioButton

示例一:
/* 实例化对象 */

radioButton1 = new QRadioButton(this);

radioButton2 = new QRadioButton(this);

/* 设置两个QRadioButton的位置和显示大小 */

radioButton1->setGeometry(300, 200, 100, 50);

radioButton2->setGeometry(400, 200, 100, 50);

/* 设置两个QRadioButton的显示文本 */

radioButton1->setText(“开关一”);

radioButton2->setText(“开关二”);

/* 设置初始状态,radioButton1的Checked为false,另一个为true*/

radioButton1->setChecked(false);

radioButton2->setChecked(true);

QRadioButton{

spacing: 2px;

color: white;

}

QRadioButton::indicator {

width: 45px;

height: 30px;

}

QRadioButton::indicator:unchecked {

image: url(:/images/switch_off.png);

}

QRadioButton::indicator:checked {

image: url(:/images/switch_on.png);

}

示例二:

■ QCommandLinkButton

/* 实例化对象 */

commandLinkButton = new QCommandLinkButton(

            "打开/home目录", "点击此将调用系统的窗口打开/home目录",this);



/* 设置QCommandLinkButton位置和显示大小 */

commandLinkButton->setGeometry(300, 200, 250, 60);



/* 信号槽连接 */

connect(commandLinkButton, SIGNAL(clicked()), this,

        SLOT(commandLinkButtonClicked()));

}

MainWindow::~MainWindow()

{

}

void MainWindow::commandLinkButtonClicked()

{

/* 调用系统服务打开/home目录 */

QDesktopServices::openUrl(QUrl("file:home/") );

}


■ QDialogButtonBox

示例一:
/* 实例化并设置按钮的盒子的大小和位置 */
dialogButtonBox = new QDialogButtonBox(this);
dialogButtonBox->setGeometry(300, 200, 200, 30);

/使用Qt的Cancel按钮/
dialogButtonBox->addButton(QDialogButtonBox::Cancel);

/*将英文"Cancel"按钮设置为中文"取消" /
dialogButtonBox->button(QDialogButtonBox::Cancel)->setText(“取消”);
/
设定位置与大小 /
pushButton = new QPushButton(tr(“自定义”));
/
将pushButton添加到dialogButtonBox,并设定ButtonRole为ActionRole /
dialogButtonBox->addButton(pushButton, QDialogButtonBox::ActionRole);
/
信号槽连接,带参数QAbstractButton *,用于判断用户点击哪个按键 */
connect(dialogButtonBox, SIGNAL(clicked(QAbstractButton * )),
this, SLOT(dialogButtonBoxClicked(QAbstractButton *)));

void MainWindow::dialogButtonBoxClicked(QAbstractButton button)
{
/
判断点击的对象是否为QDialogButtonBox::Cancel /
if(button == dialogButtonBox->button(QDialogButtonBox::Cancel)) {
/
打印“单击了取消键” /
qDebug() <<“单击了取消键”< /
判断点击的对象是否为pushButton /
}else if(button == pushButton) {
/
打印“单击了自定义键” */
qDebug() <<“单击了自定义键”< }
}



■ QToolBox

MainWindow::MainWindow(QWidget *parent)
QMainWindow(parent)
{
this->setGeometry(0, 0, 800, 480);
toolBox = new QToolBox(this);
toolBox->setGeometry(300, 50, 200, 250);
/* 设置toolBox的样式,此处设置为30%不透明度的黑色 */
toolBox->setStyleSheet("QToolBox {background-color:rgba(0, 0, 0, 30%);}");

for(int i = 0; i < 2; i++){
    vBoxLayout[i] = new QVBoxLayout();
    groupBox[i] = new QGroupBox(this);
}


/* 字符串链表 */
QList strList;
strList<<"李白"<<"王照君"<<"李元芳"<<"程咬金"<<"钟馗"<<"上官婉儿";


/* 字符串图标链表 */
QList iconsList;
iconsList<<":/icons/libai"<<":/icons/wangzhaojun"
        <<":/icons/liyuanfang"<<":/icons/chengyaojin"
       <<":/icons/zhongkui"<<":/icons/shangguanwaner";


for(int i = 0; i < 6; i++){
    toolButton[i] = new QToolButton();
    /* 设置toolButton图标 */
    toolButton[i]->setIcon(QIcon(iconsList[i]));
    /* 设置toolButton的文本 */
    toolButton[i]->setText(strList[i]);
    /* 设置toolButton的大小 */
    toolButton[i]->setFixedSize(150, 40);
    /* 设置toolButton的setToolButtonStyle的样式 */
    toolButton[i]->setToolButtonStyle(
                Qt::ToolButtonTextBesideIcon
                );
    if( i < 3 ) {
        /* 将toolButton添加到时垂直布局 */
        vBoxLayout[0]->addWidget(toolButton[i]);
        /* 添加一个伸缩量1 */
        vBoxLayout[0]->addStretch(1);
    } else {
        vBoxLayout[1]->addWidget(toolButton[i]);
        vBoxLayout[1]->addStretch(1);
    }
}
/* 将垂直布局的内容添加到组框groupBox */
groupBox[0]->setLayout(vBoxLayout[0]);
groupBox[1]->setLayout(vBoxLayout[1]);


/* 将组框加入QToolBox里 */
toolBox->addItem(groupBox[0],"我的好友");
toolBox->addItem(groupBox[1],"黑名单");

}

MainWindow::~MainWindow()
{
}

■ QGroupBox

/* 设置主窗体位置与大小 /
this->setGeometry(0, 0, 800, 480);
/
以标题为“QGroupBox示例”实例化groupBox对象 /
groupBox = new QGroupBox(tr(“QGroupBox示例”), this);
groupBox->setGeometry(300, 100, 300, 200);
vBoxLayout = new QVBoxLayout();
/
字符串链表 /
QList list;
list<<“选项一”<<“选项二”<<“选项三”;
for(int i = 0; i < 3; i++){
radioButton[i] = new QRadioButton();
radioButton[i]->setText(list[i]);
/
在vBoxLayout添加radioButton /
vBoxLayout->addWidget(radioButton[i]);
}
/
添加一个伸缩量1 /
vBoxLayout->addStretch(1);
/
vBoxLayout布局设置为groupBox布局 */
groupBox->setLayout(vBoxLayout);

QGroupBox {
border-width:1px; //线的粗细
border-style:solid;
border-color:lightGray; //颜色,
margin-top: 0.5ex; //文字在方框中位置的偏离度
}
QGroupBox::title {
subcontrol-origin: margin;
subcontrol-position: top left;
left:25px; //线的偏离度
margin-left: 0px;
padding:0 1px; //文字在方框中位置的偏离度
}
QGroupBox::title {
subcontrol-origin: margin;
position: relative;
left: 12px;
}
ui->groupBox->setStyleSheet(“background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #E0E0E0, stop: 1 #FFFFFF);”
" border-radius: 5px; margin-top: 1ex; ");//border: 2px solid gray;


■ QCheckBox

示例一: 三态按钮 ,
QCheckBox{

    spacing: 5px;

    color: white;

}

QCheckBox::indicator {

    width: 50px;

    height: 50px;

}

QCheckBox::indicator:enabled:unchecked {

    image: url(:/images/unchecked.png);

}

QCheckBox::indicator:enabled:checked {

    image: url(:/images/checked.png);

}

QCheckBox::indicator:enabled:indeterminate {

    image: url(:/images/indeterminate.png);

}
/* 实例化对象 /
checkBox = new QCheckBox(this);
/
设置QCheckBox位置和显示大小 /
checkBox->setGeometry(350, 200, 250, 50);
/
初始化三态复选框的状态为Checked /
checkBox->setCheckState(Qt::Checked);
/
设置显示的文本 /
checkBox->setText(“初始化为Checked状态”);
/
开启三态模式,必须开启,否则只有两种状态,即Checked和Unchecked /
checkBox->setTristate();
/
连接checkBox的信号stateChanged(int),与我们定义的槽checkBoxStateChanged(int)连接 /
connect(checkBox, SIGNAL(stateChanged(int)), this, SLOT(checkBoxStateChanged(int)));
/
槽函数的实现 /
void MainWindow::checkBoxStateChanged(int state)
{
/
判断checkBox的state状态,设置checkBox的文本 /
switch (state) {
case Qt::Checked:
/
选中状态 /
checkBox->setText(“Checked状态”);
break;
case Qt::Unchecked:
/
未选中状态 /
checkBox->setText(“Unchecked状态”);
break;
case Qt::PartiallyChecked:
/
半选状态 */
checkBox->setText(“PartiallyChecked状态”);
break;
default:
break;
}
}

QToolBar

/* 槽函数的实现 */

void MainWindow::checkBoxStateChanged(int state)

{

/* 判断checkBox的state状态,设置checkBox的文本 */

switch (state) {

case Qt::Checked:

    /* 选中状态 */

    checkBox->setText("Checked状态");

    break;

case Qt::Unchecked:

    /* 未选中状态 */

    checkBox->setText("Unchecked状态");

    break;

case Qt::PartiallyChecked:

    /* 半选状态 */

    checkBox->setText("PartiallyChecked状态");

    break;

default:

    break;

}

}

■ QComboBox

示例一:
/* 实例化对象 */
comboBox = new QComboBox(this);

/* 设置comboBox的显示位置与大小 */
comboBox->setGeometry(300, 200, 150, 30);
/* 添加项,我们添加三个省份,作为comboBox的三个选项 */
comboBox->addItem("广东(默认)");
comboBox->addItem("湖南");
comboBox->addItem("四川");


/* 信号槽连接 */
connect(comboBox, SIGNAL(currentIndexChanged(int)), this,
        SLOT(comboBoxIndexChanged(int)));

void MainWindow::comboBoxIndexChanged(int index)
{
/* 打印出选择的省份 */
qDebug()<<“您选择的省份是”<< comboBox->itemText(index)< }


■ QFontComboBox

/* 实例化对象 */

fontComboBox = new QFontComboBox(this);

label = new QLabel(this);



/* 设置显示的位置与大小 */

fontComboBox->setGeometry(280, 200, 200, 30);

label->setGeometry(280, 250, 300, 50);



/* 信号与槽连接 */

connect(fontComboBox, SIGNAL(currentFontChanged(QFont)), this,

        SLOT(fontComboBoxFontChanged(QFont)));

}

MainWindow::~MainWindow()

{

}

/* 槽函数实现 */

void MainWindow::fontComboBoxFontChanged(QFont font)

{

/* 将label里的文本内容设置为所选择的字体 */

label->setFont(font);



/* 定义一个字符串接收当前项的字体 */

QString str = "用此标签显示字体效果\n设置的字体为:" +

        fontComboBox->itemText(fontComboBox->currentIndex());



/* 将字符串的内容作为label的显示内容 */

label->setText(str);

}


■ QScrollArea

MainWindow::MainWindow(QWidget *parent)
QMainWindow(parent)
{
this->setGeometry(0, 0, 800, 480);
scrollArea = new QScrollArea(this);
/* 设置滚动区域为700 380 /
scrollArea->setGeometry(50, 50, 700, 380);
label = new QLabel();
/
label显示的lantingxu.png图片分辨率为1076
500 */
QImage image(“:/images/lantingxu.png”);
label->setPixmap(QPixmap::fromImage(image));
scrollArea->setWidget(label);
}
MainWindow::~MainWindow()
{
}

■ QTextEdit

/* 实例和对象,设置位置和显示大小 */

textEdit = new QTextEdit(this); 

textEdit->setGeometry(0, 0, 800, 400);



/* 实例和对象,设置位置和显示大小,设置文本 */

pushButtonSelectAll = new QPushButton(this);

pushButtonSelectAll->setGeometry(200, 420, 50, 20);

pushButtonSelectAll->setText("全选");



/* 实例和对象,设置位置和显示大小,设置文本 */

pushButtonClearAll = new QPushButton(this);

pushButtonClearAll->setGeometry(500, 420, 50, 20);

pushButtonClearAll->setText("清除");



/* 信号槽连接 */

connect(pushButtonSelectAll, SIGNAL(clicked()), this,

        SLOT(pushButtonSelectAllClicked()));

connect(pushButtonClearAll, SIGNAL(clicked()), this,

        SLOT(pushButtonClearAllClicked()));

}

MainWindow::~MainWindow()

{

}

void MainWindow::pushButtonSelectAllClicked()

{

/* 设置焦点为textEdit */

textEdit->setFocus();

/* 判断文本编辑框内容是否为空,不为空则全选 */

if(!textEdit->toPlainText().isEmpty()){

    /* 全选 */

    textEdit->selectAll();

}

}

void MainWindow::pushButtonClearAllClicked()

{

/* 清空textEdit里的文本内容 */

textEdit->clear();

}

/* 设置当前程序的工作目录为可执行程序的工作目录 */

QDir::setCurrent(QCoreApplication::applicationDirPath());



this->setGeometry(0, 0, 800, 480);

■ QLineEdit

switch (index) {
case 0:
//默认,输入什么即显示什么
echoLineEdit->setEchoMode(QLineEdit::Normal);
break;
case 1:
//密码,一般是用小黑点覆盖你所输入的字符
echoLineEdit->setEchoMode(QLineEdit::Password);
break;
case 2:
//编辑时输入字符显示输入内容,否则用小黑点代替
echoLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
break;
case 3:
//任何输入都看不见(只是看不见,不是不能输入)
echoLineEdit->setEchoMode(QLineEdit::NoEcho);
示例一: QLineEdit限制输入只能输入Ip地址,且未输入时要显示4个点展位。
// 正在表达式限制输入
ui->lineEdit_ip->setValidator(new QRegExpValidator(QRegExp(“\b(??:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b”)));
// 用于占位
ui->lineEdit_ip->setInputMask("000.000.000.000; ");


■ QPlainTextEdit

plainTextEdit = new QPlainTextEdit(this);

plainTextEdit->setGeometry(0, 50, 800, 430);



radioButton = new QRadioButton(this);

radioButton->setGeometry(650, 20, 100, 20);

radioButton->setText("只读模式");



/* 打开可执行程序目录里的moc_mainwindow.cpp,注意如果是Windows下

moc_mainwindow.cpp并不在当前目录,而在上一级目录"…/moc_mainwindow.cpp"*/

QFile file("moc_mainwindow.cpp");



/* 以只读模式打开,但是可以在plainTextEdit里编辑 */

file.open((QFile::ReadOnly | QFile::Text));



/* 加载到文件流 */

QTextStream in(&file);



/* 从文本流中读取全部 */

plainTextEdit->insertPlainText(in.readAll());



/* 信号槽连接 */

connect(radioButton, SIGNAL(clicked()), this,

        SLOT(radioButtonClicked()));

}

MainWindow::~MainWindow()

{

}

void MainWindow::radioButtonClicked()

{

/* 检查radioButton是否选中 */

if(radioButton->isChecked()) {

    /* 设置为只读模式 */

    plainTextEdit->setReadOnly(true);

} else {

    /* 设置为非只读模式 */

    plainTextEdit->setReadOnly(false);

}

}


■ QSpinBox

spinBox = new QSpinBox(this);
spinBox->setGeometry(350, 200, 150, 30);

/* 设置范围0~100 */
spinBox->setRange(0, 100);

/* 设置步长为10 */
spinBox->setSingleStep(10);

/* 设置初始值为100 */
spinBox->setValue(100);

/* 设置后缀 /
spinBox->setSuffix(“%不透明度”);
/
信号槽连接 /
connect(spinBox,SIGNAL(valueChanged(int)), this, SLOT(spinBoxValueChanged(int)));
void MainWindow::spinBoxValueChanged(int opacity)
{
/
转换为double数据类型 */
double dobleopacity = (double)opacity / 100;

/* 设置窗体不透明度,范围是0.0~1.0。1则为不透明,0为全透明 */
this->setWindowOpacity(dobleopacity);

}


■ QDoubleSpinBox

/* 实例化和设置显示的位置与大小 */
doubleSpinBox = new QDoubleSpinBox(this);
doubleSpinBox->setGeometry((this->width() - 200) / 2,
                           (this->height() - 30) / 2,
                           200, 30);
/* 设置前缀 */
doubleSpinBox->setPrefix("窗口大小");
/* 设置后缀 */
doubleSpinBox->setSuffix("%");
/* 设置范围 */
doubleSpinBox->setRange(50.00, 100.00);
/* 设置初始值 */
doubleSpinBox->setValue(100.00);
/* 设置步长 */
doubleSpinBox->setSingleStep(0.1);
/* 信号槽连接 */
connect(doubleSpinBox, SIGNAL(valueChanged(double)),
        SLOT(doubleSpinBoxValueChanged(double)));

void MainWindow::doubleSpinBoxValueChanged(double value)
{
/* 重新计算窗口的宽与高 /
int w = 800 * value / 100;
int h = 480 * value / 100;
/
重新设置窗口的宽与高 /
this->setGeometry(0, 0, w, h);
/
重新设置doubleSpinBox的显示位置 */
doubleSpinBox->setGeometry((this->width() - 200) / 2,
(this->height() - 30) / 2,
200, 30);
}



■ QDial

/* 实例化对象和设置显示位置与大小 */

dial = new QDial(this);

dial->setGeometry(300, 100, 200, 200);



/* 设置页长(两个最大刻度的间距)*/

dial->setPageStep(10);



/* 设置刻度可见 */

dial->setNotchesVisible(true);



/* 设置两个凹槽之间的目标像素数 */

dial->setNotchTarget(1.00);



/* 设置dial值的范围 */

dial->setRange(0,100);



/* 开启后可指向圆的任何角度 */

//dial->setWrapping(true);



/* 实例化对象和设置显示位置与大小 */

label = new QLabel(this);

label->setGeometry(370, 300, 200, 50);



/* 初始化为0km/h */

label->setText("0km/h");



/* 信号槽连接 */

connect(dial, SIGNAL(valueChanged(int)),

        this, SLOT(dialValueChanged(int)));

}

MainWindow::~MainWindow()

{

}

void MainWindow::dialValueChanged(int val)

{

/* QString::number()转换成字符串 */

label->setText(QString::number(val) + "km/h");

}


■ QScrollBar

/* 实例化水平滚动条及设置位置大小 */

horizontalScrollBar = new QScrollBar(Qt::Horizontal, this);

horizontalScrollBar->setGeometry(0, 450, 800, 30);



/* 实例化垂直滚动条及设置位置大小 */

verticalScrollBar = new QScrollBar(Qt::Vertical, this);

verticalScrollBar->setGeometry(770, 0, 30, 480);



/* 实例化,标签文本 */

label = new QLabel(this);

/* 设置文本 */

label->setText("这是一个测试");

/* 设置位置大小 */

label->setGeometry(300, 200, 100, 20);

■ QSlider

/* 实例化水平滑动条对象*/

horizontalSlider = new QSlider(Qt::Horizontal, this);



/* 设置显示的位置与大小 */

horizontalSlider->setGeometry(250, 100, 200, 20);



/* 设置值范围 */

horizontalSlider->setRange(0, 100);



/* 实例化垂直滑动条对象 */







/* 设置显示的位置与大小 */

verticalSlider->setGeometry(200, 50, 20, 200);



/* 设置值范围 */

verticalSlider->setRange(0, 100);



/* 实例化标签文本 */

label = new QLabel("滑动条值:0", this);

label->setGeometry(250, 200, 100, 20);



/* 信号槽连接 */

connect(horizontalSlider, SIGNAL(valueChanged(int)),

        this, SLOT(horizontalSliderValueChanged(int)));

connect(verticalSlider, SIGNAL(valueChanged(int)),

        this, SLOT(verticalSliderValueChanged(int)));

}

MainWindow::~MainWindow()

{

}

void MainWindow::horizontalSliderValueChanged(int val)

{

/* 当水平滑动条的值改变时,改变垂直滑动条的值 */

verticalSlider->setSliderPosition(val);



/* 将int类型转变成字符 */



QString str = "滑动条值:" + QString::number(val);



/* 显示当前垂直或水平滑动条的值 */

label->setText(str);

}

void MainWindow::verticalSliderValueChanged(int val)

{

/* 当垂直滑动条的值改变时,改变水平滑动条的值 */

horizontalSlider->setSliderPosition(val);

}

/* 主窗体设置位置与大小 */

this->setGeometry(0, 0, 800, 480);

■ QKeySequenceEdit

/* 实例化 */

keySequenceEdit = new QKeySequenceEdit(this);



/* 设置位置与大小 */

keySequenceEdit->setGeometry(350, 200, 150, 30);



/* 信号槽连接 */

connect(keySequenceEdit,

        SIGNAL(keySequenceChanged(const QKeySequence &)),

        this,

        SLOT(KSEKeySequenceChanged(const QKeySequence &))

        );

}

MainWindow::~MainWindow()

{

}

void MainWindow::KSEKeySequenceChanged(

    const QKeySequence &keySequence)

{

/* 判断输入的组合键是否为Ctrl + Q,如果是则退出程序 */

if(keySequence == QKeySequence(tr("Ctrl+Q"))) {

    /* 结束程序 */

    this->close();

}else {

    /* 打印出按下的组合键 */

    qDebug()<

}

/* 使用资源里的文件时格式是  :+前缀+文件路径  */

QPixmap pixmap(":images/openedv.png");

■ QLabel

labelImage = new QLabel(this);



/* 标签大小为452×132,根据图像的大小来设置 */

labelImage->setGeometry(180, 150, 452, 132);

/* 设置图像 */

labelImage->setPixmap(pixmap);

/* 开启允许缩放填充 */

labelImage->setScaledContents(true);



labelString = new QLabel(this);

labelString->setText("标签演示文本");

labelString->setGeometry(300, 300, 100, 20);


/* 设置位置与大小,下同 */

this->setGeometry(0, 0, 800, 480);



/* 对象实例化设置显示的位置与大小 */

label[i]->setText(strLabelList[i]);
/* 标签对齐方式(居中) */
label[i]->setAlignment(Qt::AlignCenter);
label[i]->setStyleSheet(“QLabel{font: normal bold 25px;color:#F0F0F0;border:2px solid #AAAAAA;background:#000000;}”);


■ QCalendarWidget

calendarWidget = new QCalendarWidget(this);

calendarWidget->setGeometry(200, 20, 400, 300);



QFont font;

/* 设置日历里字体的大小为10像素 */

font.setPixelSize(10);

calendarWidget->setFont(font);



/* 对象实例化设置显示的位置与大小 */

pushButton = new QPushButton("回到当前日期",this);

pushButton->setGeometry(200, 350, 100, 30);



/* 对象实例化设置显示的位置与大小 */

label = new QLabel(this);

label->setGeometry(400, 350, 400, 30);

QString str = "当前选择的日期:"

        + calendarWidget->selectedDate().toString();

label->setText(str);



/* 信号槽连接 */

connect(calendarWidget, SIGNAL(selectionChanged()),

        this, SLOT(calendarWidgetSelectionChanged()));

connect(pushButton, SIGNAL(clicked()),

        this, SLOT(pushButtonClicked()));

}

MainWindow::~MainWindow()

{

}

void MainWindow::calendarWidgetSelectionChanged()

{

/* 当日历点击改变当前选择的期时,更新Label的显示内容 */

QString str = "当前选择的日期:"

        + calendarWidget->selectedDate().toString();

label->setText(str);

}

void MainWindow::pushButtonClicked()

{

/* 设置当前选定的日期为系统的QDate */

calendarWidget->setSelectedDate(QDate::currentDate());

}


■ QPainter

scale()函数按给定的偏移量缩放坐标系, // painter.scale(2, 2); //在x轴和y轴方向扩大2倍,小于1为缩小
rotate()函数顺时针旋转坐标系, //painter.rotate(30);//旋转30°
translate()将坐标系平移(即向点添加给定的偏移量)。 //painter->translate(100,100);//将中心移到(100,100)
shear()函数围绕原点扭曲坐标系
setBrush(Qt::green);// 设置填充色
drawRect(0, 0, 100, 100); //
setOpacity(qreal opacity) //设置透明度。值为0.0~1.0。
void setBackgroundMode(Qt::BGMode mode)。设置背景模式。Qt::BGMode:
Qt::TransparentMode 默认设置)绘制不透明文本、填充画刷样式和绘制位图时无需设置背景像素。
Qt::OpaqueMode 用当前背景色填充不透明文本、画刷样式和位图的背景像素。
painter.drawPixmap(rect,img); //绘制位图:坐标x、y轴缩放相应比例。 auto rect = event->rect();

void save() //保存当前的画家状态(将状态推送到堆栈上)。 在save()之后必须有一个相应的restore()。(end()函数会展开堆栈)
void restore() // 恢复当前的QPainter状态(从堆栈弹出保存的状态)。
void resetTransform() //重置使用translate(),scale(),shear(),rotate(),setWorldTransform(),setViewport()和setWindow()进行的所有转换。
bool isActive() //是否已调用begin()而尚未调用end()。
void fillRect(const QRect &rectangle, const QBrush &brush) //填充矩形,可用颜色、画刷、渐变、画刷类型填充。

DEMO-0

QPainter painter(this);
painter.setPen(QPen(Qt::red,5));
painter.translate(150,150);
painter.drawText(QPointF(0,0),“黄河之水天上来”);
painter.rotate(90);
painter.drawText(QPointF(0,0),“黄河之水天上来”);
painter.rotate(90);
painter.drawText(QPointF(0,0),“黄河之水天上来”);
painter.rotate(90);
painter.drawText(QPointF(0,0),“黄河之水天上来”);


DEMO-1

translate(0,100)函数功能是移动原点坐标;
load(“./image/xuanhuan.jpg”)函数的功能是载入图片;
drawPixmap(0,0,150,100,pix)函数的功能是打开图片;
scaled(width0.2,height0.5)函数的功能是缩放图片0.2倍;
rotate(90)函数的功能是以原点为中心,使整个坐标系旋转90度;
shear(0.5,0)函数的功能是使得整个图片以原点为中心扭曲0.5系数。


■ QDateTimeEdit 、QDateEdit 、 QTimeEdit

/实例化对象,传入当前日期与时间/

dateTimeEdit = new QDateTimeEdit(QDateTime::currentDateTime(),this);

dateTimeEdit->setGeometry(300, 200, 200, 30);

/* 弹出日期控件与否 */

//dateTimeEdit->setCalendarPopup(true);

/* 实例化对象,传入当前时间 */

timeEdit = new QTimeEdit(QTime::currentTime(),this);

timeEdit->setGeometry(300, 240, 200, 30);

/* 实例化对象,传入当前日期 */

dateEdit = new QDateEdit(QDate::currentDate(),this);

dateEdit->setGeometry(300, 280, 200, 30);

QDateTimeEdit.setDisplayFormat() #指定显示格式


■ QDateTimeEdit

QDateTimeEdit{
background:transparent;
border:1px solid rgb(82,143,199);
border-radius:2px;
min-height:26px;
max-height:26px;
}

QDateTimeEdit::up-arrow{
image:url(:/commonImg/Resources/image/common/upArrow.png);
}

QDateTimeEdit::down-arrow {
image:url(:/commonImg/Resources/image/common/downArrow.png);
}
QDateTimeEdit{
color: rgb(255, 255, 255);
background:transparent;
border:1px solid rgb(82,143,199);
border-radius:5px;
}

用qt 方式修改系统时间

    ui->dateTimeEdit->setProperty("noinput", true);

// ui->dateTimeEdit->setDisplayFormat(“yyyy-MM-dd HH:mm:ss”);
ui->dateTimeEdit->setDisplayFormat(“yyyy-MM-dd HH:mm”);
// ui->dateTimeEdit->setCalendarPopup(true);
ui->dateTimeEdit->setDateTime(QDateTime::currentDateTime());

// 监听dateTimeEdit控件的valueChanged()信号,当用户修改日期和时间时执行操作
QObject::connect(ui->dateTimeEdit, &QDateTimeEdit::dateTimeChanged, [&](const QDateTime &dateTime) {
    QString dateTimeStr = dateTime.toString("yyyy-MM-dd HH:mm:ss");

    // 设置系统时间
    QString cmd = QString("date -s \"%1\"").arg(dateTimeStr);
    qDebug() << "--------" << cmd;
    QProcess::execute(cmd);
});

C语言 使用系统调用方式修改系统时间
void User::uphwclock(int y, int m, int d, int h, int min, int s)
{
char data[100];
sprintf(data,“date -s “%d-%d-%d %d:%d:%d””,y,m,d,h,min,s);

#if arm
system(data);
system(“hwclock -w”);
#endif
}


■ QDateTime

qint64 m_cursec = QDateTime::currentDateTime().toMSecsSinceEpoch(); //毫秒

QDate dd = QDateTime::fromString(“2023/6/6 10:6:10”,“yyyy/MM/dd hh:mm:ss”).date();


■ Qtimer

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));
timer->start();
这时,processOneThing()将会被重复调用并且应该很快返回(通常在处理一个数据项之后),这样Qt可以把事件传送给窗口部件,并且一旦它完成这个工作就停止这个定时器。这是在图形用户界面应用程序中实现繁重的工作的一个典型方法

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);

QTimer::singleShot(100, this, SLOT(initData()));
QTimer::singleShot(200, this, SLOT(updateCaption()));
可以通过设置setSingleShot(true)来让定时器只执行一次。也可以使用静态函数QTimer::singleShot():
class Widget2 : public QWidget
{
Q_OBJECT
public:
Widget2(QWidget* parent = 0 ):QWidget(parent),
timeID(0)
{
QPalette palette (this->palette());
palette.setBrush(QPalette::Background, QBrush(QColor(100,12,130)));
this-> setPalette( palette );
//2. 创建定时器
timeID = startTimer(100,Qt::PreciseTimer);
}
~Widget2(){}
protected:
// 3. 重写定时器事件,接收定时的到来
void timerEvent(QTimerEvent *event)
{
// 4. 判断是否为这个定时器ID(系统可能有多个定时器Id、这种方式启动的话、全放在这里处理)
if(event->timerId() == timeID)
{
//TODO function
if(timeID)
killTimer(timeID);// 5.杀死定时器
timeID = 0;
}
}
private:
int timeID;//1. 声明定时器ID
};


■ Qtime

timerLiquid = new QTimer(this);
timerLiquid->start(60000); //60000==1min
connect(timerLiquid,SIGNAL(timeout()),this,SLOT(slots_timerLiquidHandle()));

void MainWindow::slots_timerLiquidHandle()
{
static float value = 0.0001f;
for(int i=1;i<=PUMPMAXNUMBER;i++)
{
value += PumpVect[i]->getTotalVolume();
}
emit emit_TotalVolumeToChart(value+=1);
}
private slots:
void slots_timerLiquidHandle();
public slots:
void slots_timerLiquidHandle();

timer1 = new QTimer(this); // 1-second timer
timer1->start(1000);
connect(timer1,&QTimer::timeout,[=](){


    pumpALeve = m_alarmInfo.Level();
    setAlarmBackColour(pumpALeve);                  //NO_LEVEL_ALARM  MID_LEVEL_ALARM  HIGH_LEVEL_ALARM
    setAlarmString(getRoundAlarmStr(pumpALeve));
});


■ QTcpSocket

socket = new QTcpSocket(this);

connect(socket, &QTcpSocket::readyRead, =
{
// 接收服务器发送的数据
QByteArray recvMsg = socket->readAll();
ui->textBrowser_logo->append(“接受到的数据:”);
ui->textBrowser_logo->append(recvMsg);
});

//连接
connect(socket,&QTcpSocket::connected, =
{
ui->textBrowser_logo->append(QString(“连接服务器成功 IP= %1”).arg(ServerAddress()));
count=100;//心跳设置为100(大于10即可),让重连函数停止
timer_heart->start();//开始心跳
emit changeNetImage(network::NET_LAN,true);
ui->Button_connect->setDisabled(true);
});

connect(socket,&QTcpSocket::disconnected, =
{
count=0;
ui->textBrowser_logo->append(“断开”);
timer_heart->stop();//断开连接后心跳停止
timer_reConn->setInterval(5000);//每5秒钟自动重连 10次后停止
connect(timer_reConn,SIGNAL(timeout()),this,SLOT(repeatConnection()));
timer_reConn->start();
emit changeNetImage(network::NET_LAN,false);
ui->Button_connect->setEnabled(true);
});

■ QByteArray

数字转字节数组。支持基数 2 到 36。
qDebug()<< QByteArray::number(0xaceb,2);
qDebug()<< QByteArray::number(0xaceb,10);
qDebug()<< QByteArray::number(0xaceb,16);

■ QByteArray::fromHex(“123456abcdef”);。

十六进制编码使用数字 0-9 和字母 a-f(小写)。如果分隔符不是 ‘\0’,则分隔符插入到十六进制字节之间。
QByteArray macAddress = QByteArray::fromHex(“123456abcdef”);
qDebug()<< macAddress.toHex(); //returns “123456abcdef”
qDebug()<< macAddress.toHex(‘:’); // returns “12:34:56cd:ef”
qDebug()<< macAddress.toHex(0); // returns “123456abcdef”
55
56
66

struct msgBody
{
quint32 msgLen; //消息长度
quint8 data[NET_SIZE]; //消息内容
};
qDebug() << msgFramePackage << QByteArray((char*)frame->body.data,frame->body.msgLen) << endl;


文件流

描述QDataStreamQDataStream 类(数据流)QDataStream 类为QIODevice提供序列化的二进制数据。是一个编码后的二进制流,它与操作系统等无关。QFile fileModify(filePath);if(!fileModify.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)){ qDebug() << “cart.par file open failed!”; return;}QDataStream dataStream(&fileModify);QVector numVec;for(int i=0; i<100; i++){ numVec.push_back(i);}for(auto n : mumVec){ dataStream << n << " "}fileModify.close();QTextStreamQTextStream 类(文本流)QTextStream 类:用于对数据进行文本格式的读/写操作,可在 QString、QIODevice或 QByteArray 上运行,比如把数据输出到 QString、QIODevice 或 QByteArray 对象上,或进行相反的操作。QFile cartFile(filePath);if(!cartFile.open(QIODevice::ReadWrite | QIODevice::Text)){ qDebug() << “Open cart.part file failed!”; return;}QStringList fileContent;QTextStream readWrite(&cartFile);QString line = readWrite.readLine();fileContent << line;cartFile.close();

■ QDir

/转\(斜杠转反斜杠)
QDir::toNativeSeparators接口
QString path = “C:/temp/test.txt”;
path = QDir::toNativeSeparators(path);
\转/(反斜杠转斜杠)
QString path = “C:\temp\test.txt”;
path = QDir::fromNativeSeparators(path);


■ QString

windows chcp linuxlocale可以查看系统的编码方式。
QString的内部编码方式是unicode,当char* 或std::string 转换成-QString时,默认char* 或std::string的编码方式为UTF-8。

下划线

dialog->setLabelText(QFileDialog::Accept, 保存(&S));

制表符。
QString text = “A\tA”;

arg 数值转字符串补齐长度
QString QString::arg(uint a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ’ ’ )) const
fieldWidth :格式化后的字符串宽度;
base :指定将整数a转换为字符串时使用的基数(默认是十进制),还可以是二进制2 ,十六进制 16;
fillChar :待填充字符

//默认数值是3,填充长度为4,显示为10进制,长度不够就补0,最后字符串为“0003”
int num = 3;
QString str = QString(“%1”).arg(num, 4, 10, QChar(‘0’)); //补齐长度
qDebug() << str; // str == “0003”

//可通过QString::number来决定保留小数点的位数
QString str = QString::number(32, ‘f’, 2);
qDebug() << str; // str == “32.00”

//将10进制的63变成16进制的3f
QString str;
str = QString(“Decimal 63 is %1 in hexadecimal”).arg(63, 0, 16);
qDebug() << str; // str == “Decimal 63 is 3f in hexadecimal”

//还可以根据不同国家的千位分隔符显示数值字符串
QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates));
QString str = QString(“normal:%1 long split: %L2 hexadecimal: %L3”)
.arg(12345)
.arg(12345)
.arg(12345, 0, 16);
qDebug() << str; // str == “normal:12345 long split: 12,345 hexadecimal: 3039”

//arg %1 %2…%99位置替换为字符
//首先,arg(my)替换%1。然后arg(he)替换%2。最后,arg(word)替换%3。
QString my = “my”;
QString he = " Hello ";
QString word = “Word”;
QString str = QString(“Look this is %1 And %2 : %3”).arg(my).arg(he).arg(word);
qDebug() << str; // 输出 str = “Look this is my And Hello : Word”

//--------------------------------------------------------------------------------
int seconds = m_calc.elapsed() / 1000;
int hour = int(seconds / 3600);
int min = int((seconds - hour * 3600) / 60);
int sec = seconds % 60;

//QString格式化arg前面自动补0
QString str = QString(“%1:%2:%3”).arg(hour, 2, 10, QLatin1Char(‘0’)).arg(min, 2, 10, QLatin1Char(‘0’)).arg(sec, 2, 10, QLatin1Char(‘0’));
QStringList list;
list << tr(“%1”).arg(hour) << tr(“%1”).arg(min) << tr(“%1”).arg(sec);

int val = 16;
//0f
QString str = QString(“%1”).arg(val & 0xFF, 2, 16, QLatin1Char(‘0’));

//0016
QString str = QString(“%1”).arg(val, 4, 10, QLatin1Char(‘0’));
//4代表宽度,10表示10进制,空位补零

方法1.QString 转换为 char *
QString str;
char* ch;
QByteArray ba = str.toLatin1(); // mustd
ch=ba.data();
方法2.QString 转换为 char *
QString s2 = “Hello World 2!”;
QByteArray ba2;
ba2.append(s2); //也可以 ba2 = s2.toLatin1();
const char *c2 = ba2.data();
qDebug() << s2 << c2;

方法3.QString 转换为 char *

QString filename;
std::string str = filename.toStdString();
const char* ch = str.c_str();
3.char * 转换为 QString
QString(const QLatin1String &str);
QLatin1String 的构造函数:QLatin1String(const char *str);
str = QString(QLatin1String(ch));

4.char * 转换为 QString
const char *c1 = “Hello World 1!”;
QString s1(c1);
qDebug() << c1 << s1;

5.char[] 转换为QString
char ch_data[512];
QString str_data;
str_data = QString::fromLocal8Bit(ch_data,512);

中文都ok
uint8_t wifiName[MAX_NAME_LENGTH];
uint8_t wifiPassWord[MAX_NAME_LENGTH];
QString::fromUtf8((char*)wifiName)
6.char[] 转换为QString
typedef struct
{
uchar admission[20]; //住院号
//DevType type, //设备类型
uchar type; //设备类型 devstat, syb, zsb, tci, hub,
uchar mode; //设备型号 “TMS-1 =1,TMS-3 =3,TMS-5 =5”
char sn[30]; //设备序号
}Com_DevInfo;

qDebug() << “m_devInfo” << QString(m_devInfo.sn) << endl;
qDebug() << “m_devInfo” << QString::fromLocal8Bit(m_devInfo.sn) << endl;
qDebug() << “m_devInfo” << QString((char*)m_devInfo.admission) << endl;
qDebug() << “m_devInfo” << m_devInfo.type << endl;
qDebug() << “m_devInfo” << m_devInfo.mode << endl;

输出结果:
m_devInfo “2001”
m_devInfo “2001”
m_devInfo “abcdefg”

  1. QByteArray 转换为 QString
    quint8 data[100]={‘1’,‘2’,‘3’,‘1’,‘2’,‘3’,‘1’,‘2’,‘3’,‘1’,‘2’,‘3’,‘1’,‘2’,‘3’};
    QByteArray qa;
    for (int i=0;i<100;i++) {
    qa.append(data[i]);
    }
    QString recordData(qa);
    qDebug() << recordData << endl; //123123123123123

memcpy(net.wifiName,configJson->getKeyStringVal(wifiName).toLatin1().data(),configJson->getKeyStringVal(wifiName).size());
memcpy(net.wifiPassWord,configJson->getKeyStringVal(wifiPassWord).toLatin1().data(),configJson->getKeyStringVal(wifiPassWord).size());
QString swifi((char*)net.wifiName); QString swifip((char*)net.wifiPassWord);
qDebug() << net.wifiName << swifi << endl;
qDebug() << net.wifiPassWord << swifip << endl; //出现乱码 net.wifiPassWord要清0 NetInfor net; memset(&net,0,sizeof(NetInfor)); 然后在赋值

5. arg

//4代表宽度,10表示10进制,空位补零
QString str=QString("“date -s %1-%2-%3 %4:%5:%6"”).arg(ui->spinBox_systemtime1->value(),4, 10, QLatin1Char(‘0’))
.arg(ui->spinBox_systemtime2->value(),2, 10, QLatin1Char(‘0’))
.arg(ui->spinBox_systemtime3->value(),2, 10, QLatin1Char(‘0’))
.arg(ui->spinBox_systemtime4->value(),2, 10, QLatin1Char(‘0’))
.arg(ui->spinBox_systemtime5->value(),2, 10, QLatin1Char(‘0’))
.arg(ui->spinBox_systemtime6->value(),2, 10, QLatin1Char(‘0’));

QString(%1).arg(FullVersion[1], 2, 10, QChar(‘0’)) //2代表宽度,10表示10进制,空位补 QChar(‘0’)

//实现了从本地字符集GBK到Unicode的转换,
QString recordData = QString::fromLocal8Bit((const char*)&stFrame->data[5],stFrame->head.len-5);


■ Qt接收注射泵GBK编码后显示乱码

//QTextCodec 可以用于将一些本地编码的字符串转换为 Unicode
QByteArray encodedString = “中国”;
QTextCodec *codec = QTextCodec::codecForName(“GBK”);
QString string = codec->toUnicode(encodedString); //将 encodedString为GBK编码转换成Unicode编码.

//将字符串从 Unicode 转换为本地编码:
QString string = “中国”;
QTextCodec *codec = QTextCodec::codecForName(“GBK”);
QByteArray encodedString = codec->fromUnicode(string); //将 string为Unicode编码转换成GBK编码.

示例一:

/正确GBK转换Unicode/
QTextCodec codec = QTextCodec::codecForName(“GBK”);
QString stre = codec->toUnicode((char
)ps.name);
QString strd = codec->toUnicode((char*)ps.department);
QString strh = codec->toUnicode((char*)ps.hospnum);
sethospnum(stre); //中国
setdepartment(strd); //中国
setbedname(strh); //中国

/乱码/
QString qhospnum(QString::fromLocal8Bit((char*)ps.hospnum,MAX_NAME_LENGTH));
QString qdepartment(QString::fromLocal8Bit((char*)ps.department,MAX_NAME_LENGTH));
QString qname(QString::fromLocal8Bit((char*)ps.name,MAX_PATIN_NAME_LENGTH));
setname(qname); //乱码
setweight(qdepartment); //乱码
setBMI(qhospnum); //乱码

/正确Unicode转换 GBK/
QTextCodec *codec = QTextCodec::codecForName(“GBK”);
QByteArray Array1 =codec->fromUnicode(hospnum());
memcpy(pfors.hospnum,Array1.data(),qMin(Array1.size(),MAX_NAME_LENGTH));

QByteArray Array2 =codec->fromUnicode(department());
memcpy(pfors.department,Array2.data(),qMin(Array2.size(),MAX_NAME_LENGTH));

QByteArray Array3 =codec->fromUnicode(name());
memcpy(pfors.name,Array3.data(),qMin(Array3.size(),MAX_PATIN_NAME_LENGTH));


■ 编码

ASCII
(American Standard Code for Information Interchange,美国信息交换标准代码)
使用7位(bits)表示一个字符,共128字符;但是7位编码的字符集只能支持128个字符,为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符。
Latin-1:(相当于ASCII+标准的扩展ASCII)
即ISO-8859-1的别名,编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。比ASC多了西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。所以中文字符会显示为是西欧等字符"ÎÒÊÇ"

ANSI
不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。
这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。
在简体中文Windows操作系统中,ANSI 编码代表 GB2312编码;
在繁体中文Windows操作系统中,ANSI编码代表Big5;
在日文Windows操作系统中, ANSI 编码代表 JIS 编码。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。
ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节。

GB2312
GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;
GB2312对任意一个图形字符都采用两个字节表示,并对所收汉字进行了“分区”处理,每区含有94个汉字/符号,分别对应第一字节和第二字节。
对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK 及GB18030 汉字字符集的出现。

GBK
GBK全称《汉字内码扩展规范》 中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订
GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准
GBK共收入21886个汉字和图形符号。
GBK采用双字节表示,总体编码范围为8140-FEFE之间,首字节在81-FE之间,尾字节在40-FE之间。

GB18030 编码
与 GBK 不同的是,GB18030 是变长多字节字符集,每个字或字符可以由一个,两个或四个字节组成,所以它的编码空间是很大的,最多可以容纳 161 万个字符
由于需要兼容 GBK,四个字节的前两个字节和 GBK 编码保持一致,GB18030 具体的编码范围如下

// GBK编码和UTF-8编码互相转换的函数。返回值是QString, 验证ok
inline QString GBK2UTF8(QByteArray &inStr)
{
QTextCodec *gbk = QTextCodec::codecForName(“gbk”);
QTextCodec *utf8 = QTextCodec::codecForName(“UTF-8”);
char *p = inStr.data();
QString str = gbk->toUnicode§;
QByteArray utf8_bytes=utf8->fromUnicode(str);
p = utf8_bytes.data();
str = p;
return str;
}

inline QString UTF82GBK(QByteArray &inStr)
{
QTextCodec *gbk = QTextCodec::codecForName(“gbk”);
QTextCodec *utf8 = QTextCodec::codecForName(“UTF-8”);
char *p = inStr.data();
QString str = utf8->toUnicode§;
QByteArray utf8_bytes=gbk->fromUnicode(str);
p = utf8_bytes.data();
str = p;
return str;
}

//根据上面代码优化 实现和云平台对接不乱码问题。
/将GBK编码转换成UTF-8编码,返回值是QString/
//说明 m_realdata.drugname[20] 是泵的GBK编码。
QByteArray gdkStr((char*)m_realdata.drugname);
QTextCodec *gbk = QTextCodec::codecForName(“gbk”);
QTextCodec *utf8 = QTextCodec::codecForName(“UTF-8”);
QString gbkstring = gbk->toUnicode(gdkStr);
QByteArray utf8_bytes=utf8->fromUnicode(gbkstring);
return utf8_bytes;

//GBK‐> QString unicode
uint8_t utf8[] = {0xCA ,0xB9, 0xD3, 0xC3, 0xCA, 0xE4, 0xD2 ,0xBA, 0xC6, 0xF7, 0x3A, 0x57, 0x45, 0x49, 0x47, 0x41, 0x4F};
QString str2 = QString::fromLocal8Bit((char*)utf8); //QT默认的编码是unicode,不能显示中文的 实现了从本地字符集GBK到Unicode的转换,
qDebug() << str2 << endl; //使用输液器:WEIGAO

//stFrame->data[5] 是GB2312 十六进制数据,通过一下转写入到U盘文件中,可以查看不乱码。
QString recordData = QString::fromLocal8Bit((const char*)&stFrame->data[5],stFrame->head.len-5); //实现了从本地字符集GBK到Unicode的转换,
/末尾添加/
void CsvFile::tailAppendCsvLine(QString &content)
{
file.atEnd();
content += \n;
file.write(content.toLocal8Bit().data()); 、、写入文件后可以显示中文
file.flush();
}

QString qstr;
QByteArray qbytea1 = qstr.toLatin1(); //Latin1代表ASCII ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF。亦称为Latin1。
QByteArray qbytea2 = qstr.toUtf8(); //utf8字符集以2个或以上的字节表示一个汉字。
QByteArray qbytea3 = qstr.toLocal8Bit(); //Local8Bit代表unicode unicode字符集以2个或以上的字节表示一个汉字。

QString(const char str) //char字符串,默认这个字符串是以utf-8编码的.
QString::fromUtf8

QString s1 = u8中国;
QString s2 = QString::fromUtf8(u8中国);
std::string stdS = u8中国;
QString s3 = QString::fromStdString(stdS); //QString::fromStdString也是将std::string中的字符串当做utf-8编码来处理的。

qDebug() << s1 << s2 << s3 << endl; //中国 中国 中国

/* 转换为字节数组 */

QString s1 = “我是中文”;
QString s2(“我是中文”);
QString s3;
s3 = “我是中文”
s1、s2 用的是QString的构造函数QString ( const char * str )

s3 用的是QString的赋值操作符 QString & operator= ( const char * str)

如果不指定编码,s1,s2,s3将全部都是(国内大多数人所称的)乱码。因为QString将这些const char *按照latin1来解释的,而不是用户期待的gbk或utf8。

QTextCodec::setCodecForCStrings(QTextCodec::codecForName(“GB2312”));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(“UTF-8”))


Unicode:
Unicode只是一种编码规范,而实现方式就有:utf8,utf16,utf32等。
Unicode是一种字符编码,它为每个字符分配了一个唯一的数字,无论平台、程序或语言如何,都可以使用相同的数字来表示该字符。Unicode支持超过100,000个字符,包括世界上所有的语言、符号和表情。Unicode编码通常用于国际化应用程序和网站,以确保它们可以在全球范围内使用。

UTF-8:
UTF-8是一种Unicode编码方式,它使用1到4个字节来表示每个字符。UTF-8是一种变长编码方式,它可以表示Unicode标准中的任何字符,而且也是互联网上最常用的编码方式之一。

■ QFile

#include

/* QFile类型对象 */
QFile file;

/* 获取文件的路径 */
QString fileName = QFileDialog::getOpenFileName(this);

/* 指向文件 */
file.setFileName(fileName);

/* 判断文件是否存在 */
if (!file.exists())
return false;

/* 以读写的方式打开 */
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return false;

/* 读取文本到textEdit */
textEdit->setPlainText(file.readAll());

/* 关闭文件 */
file.close();

/* 以只读的方式打开 */
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;

/* 转换为字节数组 */
QByteArray strBytes = str.toUtf8();

/* 写入文件 */
file.write(strBytes, strBytes.length());

/* 关闭文件 */
file.close();


■ QSound

#include

/* 异步的方式播放 */
QSound::play(“:/audio/bell.wav”);


■ QTextStream

/* 获取文件的路径 */
QString fileName = QFileDialog::getOpenFileName(this);

/* 指向文件 */
file.setFileName(fileName);

/* 判断文件是否存在 */
if (!file.exists())
return false;

/* 以读写的方式打开 */
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return false;

/* 使用文本流读取文件 */
QTextStream stream(&file);
stream.setCodec(“utf-8”); //这行的目的是支持读取中文信息 // stream.setCodec(“GB2312”);

/* 读取文本到textEdit */
textEdit->setPlainText(stream.readAll());

/* 关闭文件 */
file.close();

/* 以只写的方式打开 */
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;

/* 用文本流读取文件 */
QTextStream stream(&file);

/* 获取textEdit的文本内容,转为字符串 */
QString str = textEdit->toPlainText();

/* 使用流提取运算符,写入文本流 */
stream<

/* 关闭文件 */
file.close();


■ QProgressBar样式表

QProgressBar {
border: 2px solid grey;
border-radius: 5px;
background-color: #FFFFFF;
}
QProgressBar::chunk {
border-radius: 5px;
background-color: #05B8CC;
width: 20px;
}

QProgressBar {
border: 2px solid grey;
border-radius: 5px;
text-align: center;
}

QProgressBar::chunk{
border-radius: 5px;
background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0 red,stop:1 blue);
}

第一步:
height:30;
background: red;
color:rgb(255,255,0);

第二步:
border:1px solid #FFFFFF;
height:30;
background: red;
color:rgb(255,255,0);

第三步:
border:1px solid #FFFFFF;
height:30;
background: red;
text-align: center; // 控制文本位置left center right
color:rgb(255,255,0);
border-radius:10px;

第四步:添加斑马线。
QProgressBar{
border:1px solid #FFFFFF;"
“height:30;”
“background:red;”
“text-align:center;”
“color:rgb(255,255,0);”
“border-radius:10px;}”
“QProgressBar::chunk{”
“border-radius:5px;” // 斑马线圆角
“border:1px solid black;” // 黑边,默认无边
“background-color:skyblue;”
"width:8px;margin:0.5px;
}

第五步:
QProgressBar::chunk{
border-radius: 5px;
background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0 red,stop:1 blue);
}


■ 线程互斥
一个线程显示,一个线程修改内容。


■ QT队列的(QQueue)

头文件#include

/定义一个队列 <>中的类型也可以是自己定义的结构体类性/
QQueue queue;

/入队列/
queue.enqueue(128);

/出队列/
uint8_t num = queue.dequeue();
    
/队列判空,返回boo类型/
queue.isEmpty();

/队列元素个数,返回队列中还有多少个元素/
queue.size();

/清空队列/
queue.clear();

■ QThread

#include
class myThread : public QThread
{
Q_OBJECT
signals:
downloaded(int);
public:
myThread();
void run()
{
for(int i=0;i<100; i++)
{
//p1->setValue(i);
emit downloaded(i);
QThread::sleep(2);
}
}
};
t2 = new myThread;
t2->start();

■ Qss

Qt 支持很多种常见
符号
“>”代表直属子部件,说明两个控件之间是父子关系。
“#”代表后面的字段是前面控件类型的名称,当然也可以省略控件类型直接写作#objectname这样.
. 表示当前的控件。
.QWidget //表示只设置当前的QWidget
{
background-color:transparent;
}

/提示工具/
/提示窗口的背景/
QWidget#ToolTipForm
{
background-color:transparent;
}

/提示窗口的frame/
QWidget#ToolTipForm>QFrame#frame
{
background-color:#aaff7f;
border:none;
border-radius:20px;
}

/标签/
QFrame#frame>QLabel#label
{
background-color:transparent;
color:#ffffff;
font:14px,“宋体”;
}

//这样还没有达到完全的圆角窗口,窗口存在圆角下面的黑色方角,最关键的一步:需要在该提示工具的窗口类的构造函数中加入窗口无标题栏和背景透明的设置。
setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
setWindowFlags(Qt::WindowTransparentForInput | Qt::ToolTip | Qt::FramelessWindowHint);//窗口仅用于输出,不接收任何输入事件
自定义类型中编写样式表。


■ setStyleSheet

btn->setStyleSheet(background-color:rgb(41,176,204);color:white;border:none;border-radius:1px;);

//设置按钮样式
QStringList list;
//list << QString(“QAbstractSpinBox{border:2px solid #7C7C96;background:#FF0000;})”;
list << QString(“QPushButton{min-width:%1px;max-width:%1px;min-height:%1px;max-height:%1px;}”).arg(btnSize);
list << QString(“QPushButton{border-image:url(:/image/ycontrol/spinBoxButton_normal.png);}”);
list << QString(“QPushButton:pressed{border-image:url(:/image/ycontrol/spinBoxButton_select.png);}”);
list << QString(“#qt_spinbox_btnDown{image:url(:/image/ycontrol/spinBoxButton_normal_minus.png)}”);
list << QString(“#qt_spinbox_btnDown:pressed{image:url(:/image/ycontrol/spinBoxButton_select_minus.png)}”);
list << QString(“#qt_spinbox_btnUp{image:url(:/image/ycontrol/spinBoxButton_normal_plus.png)}”);
list << QString(“#qt_spinbox_btnUp:pressed{image:url(:/image/ycontrol/spinBoxButton_select_plus.png)}”);
this->setStyleSheet(list.join(“”));

示例一:
QRadioButton{
spacing: 2px;
color: white;
}
QRadioButton::indicator {
width: 45px;
height: 30px;
}
QRadioButton::indicator:unchecked {
image: url(:/images/switch_off.png);
}
QRadioButton::indicator:checked {
image: url(:/images/switch_on.png);
}
int main(int argc, char argv[])
{
QApplication a(argc, argv);
/
指定文件 */
QFile file(“:/style.qss”);

/* 判断文件是否存在 */
if (file.exists() ) {
    /* 以只读的方式打开 */
    file.open(QFile::ReadOnly);
    /* 以字符串的方式保存读出的结果 */
    QString styleSheet = QLatin1String(file.readAll());
    /* 设置全局样式 */
    qApp->setStyleSheet(styleSheet);
    /* 关闭文件 */
    file.close();
}
MainWindow w;
w.show();
return a.exec();

}

■ 限制QLineEdit的数值输入范围

一共4种限制器:QDoubleValidator, QIntValidator, QRegExpValidator, 和QRegularExpressionValidator

QDoubleValidator
lineEdit->setValidator(new QIntValidator(0, 1000, this));
QIntValidator
lineEdit->setValidator(new QDoubleValidator(-180.0,180.0,6,this));
QRegExpValidator
//限制浮点数输入范围为[-999999.9999,999999.9999]
QRegExp rx(“^(-?[0]|-?[1-9][0-9]{0,5})(?:\.\d{1,4})?KaTeX parse error: Got function '\\' with no arguments as superscript at position 4: |(^\̲\̲t?)”);
QRegExpValidator *pReg = new QRegExpValidator(rx, this);
lineEdit->setValidator(pReg);
//限制浮点数输入范围为[-180,180]
QRegExp rx(“(-?180$)|(^-?1[0-7]\d$)|(-?[1-9]\d ) ∣ ( − ? [ 1 − 9 ] )|(^-?[1-9] )(?[19])|^0$”);
QRegExpValidator *pReg = new QRegExpValidator(rx, this);
lineEdit->setValidator(pReg);

QRegularExpressionValidator
示例一:将输入限制为1到100之间的整数
QRegularExpressionValidator* validator = new QRegularExpressionValidator(QRegularExpression(“([1-9][0-9]?|100)”), this);
ui->lineEdit_BMI->setValidator(validator);
ui->lineEdit_height->setValidator(validator);

正则表达式限定符

表达式描述实例\b匹配单词边界\bmaster\b : 就匹配有边界的master单词\B非单词的边界{n}重复n次{n,}重复n次或更多次, 最少n次, 最多无限次{n,m}重复n到m次, 最少n次, 最多m次?重复0次或1次+重复1次或更多次重复0次或多次.代指除换行符以外的任意字符, 问号?表示阻断贪婪模式| ab|cd 匹配 ab 或 cd^开始$结束字符串的开头/结尾特殊字符由于正则表达式中 . \ {} ()等都具有特殊的含义,所以如果想要在正则中匹配这种指定的字符,需要转义

限制示例:
限制浮点数输入范围为[-999999.9999,999999.9999] "(-?[0]|-?[1-9][0-9]{0,5})(?:\.\d{1,4})?$|(^\t?$)“限制浮点数输入范围为[-180,180]”(-?180 ) ∣ ( − ? 1 [ 0 − 7 ] d )|(^-?1[0-7]\\d )(?1[07]d)|(-?[1-9]\d$)|(^-?[1-9]$)|0 " 限制浮点数输入范围为 [ − 180 , 180 ] " − ? ( 180 ∣ 1 ? [ 0 − 7 ] ? d ( . d + ) ? ) "限制浮点数输入范围为[-180,180]"^-?(180|1?[0-7]?\\d(\\.\\d+)?) "限制浮点数输入范围为[180,180]"?(180∣1?[07]?d(.d+)?)“限制浮点数输入范围为[-180,180]并限定为小数位后4位”^-?(180|1?[0-7]?\d(\.\d{1,4})?) " 限制浮点数输入范围为 [ − 90 , 90 ] 并限定为小数位后 4 位 " − ? ( 90 ∣ [ 1 − 8 ] ? d ( . d 1 , 4 ) ? ) "限制浮点数输入范围为[-90,90]并限定为小数位后4位"^-?(90|[1-8]?\\d(\\.\\d{1,4})?) "限制浮点数输入范围为[90,90]并限定为小数位后4"?(90∣[18]?d(.d1,4)?)“限制输入范围 [1-100]”([1-9][0-9]?|100)"限制输入范围 [1-5]输入1 限制输入范围 [ 1 − 10 ] 输 入 ( ? : [ 1 − 9 ] ∣ 10 ) 限制输入范围 [1-10]输入^(?:[1-9]|10) 限制输入范围[110](?:[19]∣10)限制输入范围 [1-30]输入^(?:[0-9]|[1-2][0-9]|30) 限制输入范围 [ 1 − 50 ] 输入 " ( ? : [ 1 − 9 ] ∣ [ 1 − 4 ] [ 0 − 9 ] ∣ 50 ) 限制输入范围 [1-50]输入"^(?:[1-9]|[1-4][0-9]|50) 限制输入范围[150]输入"(?:[19][14][09]∣50)“限制输入范围 [1-100]输入^(?:[0-9]|[1-9][0-9]|100) 限制输入范围 [ 1 − 200 ] 输入 " ( ? : [ 1 − 9 ] ∣ [ 1 − 9 ] [ 0 − 9 ] ∣ 1 [ 0 − 9 ] 2 ∣ 200 ) 限制输入范围 [1-200]输入"^(?:[1-9]|[1-9][0-9]|1[0-9]{2}|200) 限制输入范围[1200]输入"(?:[19][19][09]∣1[09]2∣200)

#include
QRegularExpressionValidator* m_validator1_10;
m_validator1_10 = new QRegularExpressionValidator(QRegularExpression(“^(?:[1-9]|[1-4][0-9]|50)$”), this);
ui->lineEdit_7_MagAbsorptionRate->setValidator(m_validator1_10);


■ QMessageBox

示例一:
#include
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QMessageBox MBox;
MBox.setWindowTitle("QMessageBox自定义对话框");
MBox.setText("这是一个自定义的对话框");
MBox.setIconPixmap(QPixmap("C:\\Users\\xiexuewu\\Desktop\\icon_c.png"));
QPushButton *agreeBut = MBox.addButton("同意", QMessageBox::AcceptRole);
MBox.exec();
if (MBox.clickedButton() == (QAbstractButton*)agreeBut) {
    //在 Qt Creator 的输出窗口中输出指定字符串
    qDebug() << "用户点击了同意按钮";
}
return a.exec();

}

//按钮样式设置,
QMessageBox QPushButton{
border: 1px solid black; border-radius: 10px;
}

box.setStyleSheet(“QLabel{”
“min-width: 300px;”
“min-height: 300px; "
“font-size:20px;”
“}”
“QPushButton {”
“background-color:#89AFDE;”
" border-style: outset;”
" border-width: 10px;"
" border-radius: 20px;"
" border-color: beige;"
" font: bold 15px;"
" min-width: 15em;"
" min-height: 5em;"
“}”
“”);//此处设置弹窗的字体和按钮属性

示例二:
QMessageBox box;
//设置文本框的大小和颜色
box.setStyleSheet(“QLabel{”
“min-width: 300px;”
"min-height: 150px; "
“font-size: 16px;”
“color: red;”
“}”);
box.setText(“这是一个QMessageBox”);
box.setWindowTitle(“关于”);
box.exec();

示例三:


■ Qt SQL

Qt 支持很多种常见的数据库,如 MySQL、 Oracle、MS SQL Server、 SQLite 等。 Qt SQL 模块里包含了很多个类,可以轻松实现数据库的连接、执行 SQL 语句,获取数据库里的数据与界面显示等功能
在嵌入式里,一般常用的数据库就是 Sqlite3。 SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于 250KiB。 SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,

在 QSqlDatabase 连接数据库后,用 QSqlTableModel 从数据库里读取出表格模型,然后通过 Qt 的 QTableView 类显示数据库的内容在我们面前。
需要对数据库的数据进行修改可以使用 QSqlQuery,或者直接修改QSqlTableModel 对象,修改里面的模型数据即可!


■ 顺序容器类

QList
比较常用的容器类,以数组列表的形式实现,在前、后添加数据非常快。以下为常用方法。
QList list;

插入:insert() //list.insert(2, “mm”); // 在位置2插入项目 list << “aa” << “bb” << “cc”; // 插入项目
删除:removeAt(i) //i 是下标
删除第3个 QString str = list.takeAt(2); // 从列表中删除第3个项目,并获取它
替换:replace() //替换第3个元素 list.replace(2, “bc”);
交换: swap() // list.swap(1,3); // 交换项目1和项目3
移动:move()
添加:append() // list.append(“dd”); // 在列表尾部添加
头部添加: prepend(“mm”) list.prepend(“mm”); // 在列表头部添加
包含: list.contains(“mm”); //列表中是否包含“mm”
列表包含某值个数: list.count(“mm”); 包含“mm”的个数
查找 : list.indexOf(“mm”); // 第一个“mm”的位置,默认从位置0开始往前查找 ,返回第一个匹配的项目的位置
往前查找: list.indexOf(“mm”, 2); // 第二个“mm”的位置,我们指定从位置1开始往前查找
QList list;
list << “A” << “B” << “C” << “B” << “A”;
list.indexOf(“B”); // returns 1
list.indexOf(“B”, 1); // returns 1
list.indexOf(“B”, 2); // returns 3
list.indexOf(“X”); // returns -1
bool QList::empty() const表为空,则返回true
list.begin(), list.end()
for(int i=0; i {
qDebug() << list.at(i);
}

QList z;
z <<1<<2<<3<<4; // z对应的值z[0] = 1;z[1] = 2;z[2] = 3;z[3] = 4;
QList z;
z <<1<<2<<3<<4;
z.removeAt(1); //删除下标为1后,z对应的值z[0] = 1;z[1] = 3;z[2] = 4;

1 #include
2 #include
3 #include
4 int main(int argc, char *argv[])
5 {
6 QCoreApplication a(argc, argv);
7 QList list;
8 list << “aa” << “bb” << “cc”; // 插入项目
9 if(list[1] == “bb”) list[1] = “ab”;
10 list.replace(2, “bc”); // 将“cc”换为“bc”
11 qDebug() << "the list is: "; // 输出整个列表
12 for(int i=0; i 13 qDebug() << list.at(i); // 现在列表为aa ab bc
14 }
15 list.append(“dd”); // 在列表尾部添加
16 list.prepend(“mm”); // 在列表头部添加
17 QString str = list.takeAt(2); // 从列表中删除第3个项目,并获取它
18 qDebug() << "at(2) item is: " << str;
19 qDebug() << "the list is: ";
20 for(int i=0; i 21 {
22 qDebug() << list.at(i); // 现在列表为mm aa bc dd
23 }
24 list.insert(2, “mm”); // 在位置2插入项目
25 list.swap(1,3); // 交换项目1和项目3
26 qDebug() << "the list is: ";
27 for(int i=0; i 28 {
29 qDebug() << list.at(i); // 现在列表为mm bc mm aa dd
30 }
31 qDebug() << “contains ‘mm’ ?” << list.contains(“mm”); // 列表中是否包含“mm”
32 qDebug() << "the ‘mm’ count: " << list.count(“mm”); // 包含“mm”的个数
33 // 第一个“mm”的位置,默认从位置0开始往前查找,返回第一个匹配的项目的位置
34 qDebug() << "the first ‘mm’ index: " << list.indexOf(“mm”);
35 // 第二个“mm”的位置,我们指定从位置1开始往前查找
36 qDebug() << "the second ‘mm’ index: " << list.indexOf(“mm”, 1);
37 return a.exec();
38 }

QVector

append函数或者<<操作符来在数组最后端添加元素而不用担心溢出问题。
定义 QVector array(10) ; array[5]=4;
加元素 strArray.append(“Hello”); //可以这样
加元素 strArray<<“World!”; //也可以这样
插入: strArray.insert(1,“这就是在hello和world之间添加”);
删除: strArray.remove(1); //删除第一个元素,从0开始 strArray.remove(1,3); //从1开始,删除3个元素
复制(取代): strArray.replace(1,“LEO”); //删除第一个元素,从0开始
是否含有contains()函数是用来查找向量容器内是否含有某个对象。
count()函数可以找出某个对象出现的次数。
resize()函数可以在任何时候改变QVector向量容器的体积
capacity()函数会告诉你向量容器所占内存的实际大小空间。
判断是否包含某元素 qDebug()<< Array.contains(12);

末端添加元素:
QVector Array;
Array<<3; //第一种方式
Array.append(5); //第二种方式

种方式
QVector::iterator num;
for (num=Array.begin(); num!=Array.end(); num++)
{
qDebug()<< *num;
}

//第二种方式
for (int i=0; i {
qDebug()<< Array[i];
}

QVector strArray;

QLinkedList

是链式列表,数据项不是连续的内存存储,基于迭代器访问数据项,插入和删除数据项操作时间相同
QLinkedList list;
list<<“1”<<“2”<<“3”<<“4”;
// foreach正序:
QString str;
foreach (str, list)
qDebug() << str;

// 迭代器正序
QLinkedList::iterator it;
for(it = list.begin(); it != list.end(); ++it){
qDebug() << *it;
}

// 迭代器倒序
QLinkedList::const_iterator it = list.constEnd();
while (it != list.constBegin())
{
–it;
qDebug()<<*it;
}
移除某个节点
list.removeOne(“4”);

列表大小
list.size()
链头位置插入
list.push_front(“5”);

链尾位置插入
list.push_back(“5”);
清空
list.clear();

QStack

类似于堆栈,后入先出的特点,push()和pop()用于数据进出栈。

QStack s;    //定义一个int型栈

s. isEmpty();    //返回栈是否为空

s.size(); //返回当前栈中元素的个数

s.push(); //在栈顶上堆进一个元素

s.pop(); //删除掉栈顶上的元素,并返回这个元素

s.top(); //返回栈顶的元素,并不会删除

T & operator[] ( int i );    //以数组形式访问队列元素

QStack stack;
stack.push(1);
stack.push(2);
stack.push(3);

while(!stack.isEmpty())
stack.pop();

QQueue

它的父类是QList,是个模板类
类似于队列,先入先出的特点,enqueue()和dequeue()用于操作数据进出队列。
QQueue Q;   //定义一个int型队列
Q.isEmpty(); //返回队列是否为空
Q.size(); //返回队列元素个数
Q.clear(); //清空队列
Q.enqueue(); //在队列尾部添加一个元素, 比如插入数字5: Q.enqueue(5)
Q.dequeue(); //删除当前队列第一个元素,并返回这个元素
Q.head(); //返回当前队列第一个元素
Q.last(); //返回当前队列尾部的元素
T & operator[]( int i ); //以数组形式访问队列元素

QQueue queue;
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);

while(!queue.isEmpty())
queue.dequeue();

■ 关联容器类

QSet, QMap, QMultiMap, QHash, QMultiHash

QSet

基于散列表的集合模板类,存储数据的顺序不定,查找速度非常快。
QSet类是一个模板类,他是一个哈希表集合。QSet是Qt的一个普通容器类。QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能。他和QHash很像PS:Set就是键值一样的Hash
QSet set;
set.insert(“one”);
set.insert(“three”);
set << “twelve” << “fifteen” << “nineteen”;

使用contains()判断set中是否存在某一项:
if (!set.contains(“ninety-nine”))

遍历整个set
QSetIterator i(set);
while (i.hasNext())
qDebug() << i.next();

QSet::const_iterator i = set.constBegin();
while (i != set.constEnd()) {
qDebug() << *i;
++i;
}

QSet set;


foreach (const QString &value, set)
qDebug() << value;

#include
#include
#include

class Data{
public:
Data(const QString &strVal, const int &intVal){

    StrVal = strVal;
    IntVal = intVal;
} 
QString StrVal;
int IntVal; 
friend QDebug operator << (QDebug os, Data data){

    os << "(" << data.StrVal << " ,"
       << data.IntVal << ")";

    return os;
}

};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QSet dataSet;
dataSet.insert(new Data("ABC", 0));
dataSet.insert(new Data("DEF", 1));
dataSet << new Data("AAA", 2);
dataSet << new Data("CCC", 3);

//Java style
QSetIterator i(dataSet);
while(i.hasNext())
    qDebug() << *(i.next());

//STL style
QSet::const_iterator stlI = dataSet.constBegin();
while(stlI != dataSet.constEnd()){
    
    qDebug() << **stlI;
    delete *stlI;
    stlI++;
} 
return a.exec();

}

QMap

QMap存储数据按照键的顺序来存储的,一个键映射一个值。

QMap map;
map[1] = 1;
map[2] = 2;
map[3] = 3;
//或者使用insert
QMap map;
map.insert(1,1);
map.insert(2,2);
map.insert(3,3);

int num = map[1]; //或者 int num2 = map.value[2];

QMultiMap

是QMap的子类,一个键可以对应多个值。

QMultiMap map;
map.insert(1,1);
map.insert(1,2);
//map.size() == 2

QHash

基于散列表来实现的,查找速度非常快。
和QMap比较
QHash查找速度更快
QMap是按键顺序排序的,QHash数据项任意排序

创建,键值对的方式插入,数据类型随意,这里以键int,值QString示例。
QHash qhash;

//方式一
qhash[1] = “1”;
qhash[2] = “2”;
qhash[3] = “3”;

//方式二
qhash.insert(4, “4”);
通常,QHash 每个键只允许有一个值。如果用已经存在的键调用 insert(),先前的值将被删除
qhash.insert(4,"10);
最后键为4的值将变成“10”。

取值;
//方式一
QString str1=qhash.value(1);//str1=“1”;

//方式二
QString str2=qhash[2];//str1=“2”;

如果qhash里面没有该键值,则返回默认构造值;比如:QString str3=qhash.value(5);//str3=“”;

检索某个值是否在里面
if(qhash.contains(9))
{
return false;
}

if(qhash.contains(1))
{
return true;
}

查找某个字并获取,一般推荐contains结合value重载函数来实现,

QString str;
if(qhash.contains(1))
{
str=qhash.value(1);
}
else
{
str=qhash.value(1,“wert”);
//如果哈希表中不存在指定键的元素,该函数使用第2个参数作为默认值
}

QHash::const_iterator it = qhash.constBegin();
while (it != qhash.constEnd()) {
cout << it.key() << ": " << it.value() << Qt::endl;
++i;
}
当然不用const_iterator也可以,直接iterator;

删除,下面两种都可以
qhash.erase(it);//这里的it是迭代器哦
qhash.remove(key);

QMultiHash

QMultiHash是QHash的子类,用于处理多值映射的类,与QMultiMap类似。


■ 数据库

SQLite

Qt 提供了很多操作数据库的类,
SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于 250KiB。 SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。就像其他数据库, SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。 SQLite 可以直接访问其存储文件。

QSqlDatabase 类用于建立数据库的连接,往往以指定加载的数据库驱动,然后设置数据库的登录参数,如主机地址,用户名、登录密码等。这些都是服务器类型的数据库所需要做的操作
在 QSqlDatabase 连接数据库后,用 QSqlTableModel 从数据库里读取出表格模型,然后通过 Qt 的 QTableView 类显示数据库的内容在我们面前。

/需要添加模块/
QT += sql

/* 查看本机可用的数据库驱动 */
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers) {
qDebug()< }

/* 以QSQLITE驱动方式打开或者创建数据库 /
sqlDatabase = QSqlDatabase::addDatabase(“QSQLITE”);
sqlDatabase.setDatabaseName(“alarm.db”);
/
以open的方式打开alarm.db数据库,则会创建一个alarm.db */
if (!sqlDatabase.open())
qDebug()<<“连接数据库错误”< else
qDebug()<<“连接数据库成功”<

QSqlQuery query(sqlDatabase);

/* 使用指令式创建表 /
query.exec(“create table alarm (id int primary key, time vchar(15), flag vchar(5))”); // primary 说明id不能为空
/
以指令的方式插入数据 */
//query.exec(“insert into alarm values(0, ‘06:00’, ‘false’)”);

model = new QSqlTableModel(this, sqlDatabase);

/* 模型设置表的名字,需要与数据库的表的名字相同 */
model->setTable(“alarm”);

/* 如果有修改则同步修改到数据库,

  • 注意这个规则需要与tabview这样的控件才生效,
  • 因为tabview可以直接编辑表里的内容 */
    model->setEditStrategy(QSqlTableModel::OnFieldChange);

/* 成功则返回true,查看数据库里是否有alarm这个表格 */
model->select();

/* 如果数据表数据为空,则添加两个闹钟 /
if (model->rowCount() == 0) {
/
插入一行 /
model->insertRow(model->rowCount());
/
在该行插入数据 /
model->setData(model->index(0, 0), 1);
model->setData(model->index(0, 1), “06:00”);
model->setData(model->index(0, 2), “false”);
/
插入数据后记得提交 */
model->submit();

/* 再插入一行 */
model->insertRow(model->rowCount());
model->setData(model->index(1, 0), 2);
model->setData(model->index(1, 1), "18:00");
model->setData(model->index(1, 2), "true");
/* 提交 */
model->submit();

}

/* 打印出闹钟数据库里的信息 */
for (int i = 0; i < model->rowCount(); i++) {
for (int j = 0; j < 3; j++) {
QModelIndex qindex = model->index(i, j);
switch (j) {
case 0:
qDebug()<<“第”<< model->data(qindex).toInt()<<“行数据”;
break;
case 1:
listWidget->addItem(model->data(qindex).toString());
qDebug()<<“闹钟时间为:”<< model->data(qindex).toString();
break;
case 2:
qDebug()<<“闹钟状态为:” << model->data(qindex).toString()< if (model->data(qindex).toString() != “true”)
listWidget->item(i)->setTextColor(QColor(22, 22, 22, 60));
else
listWidget->item(i)->setTextColor(QColor(22, 22, 22, 225));
break;
default:
break;
}
}
}

/* 获取数据库里的闹钟开关状态 */
QModelIndex qindex = model->index(i, 2);
bool sw = model->data(qindex).toBool()

/*设置数据库里的闹钟开关状态 */
QModelIndex qindex = model->index(i, 2);
model->setData(qindex, “true”);

CSV

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),


json

QJsonValue
void remove(const QString &key);
QJsonValue take(const QString &key);
bool contains(const QString &key) const;
void remove(QStringView key);
void remove(QLatin1String key);
QJsonValue take(QStringView key);
QJsonValue take(QLatin1String key);
bool contains(QStringView key) const;
bool contains(QLatin1String key) const;

QJsonArray

删除数组 i;
void removeAt(int i); //jArray.removeAt(0); //ok //删除第0项
QJsonValue takeAt(int i); //qDebug() << jArray.takeAt(0).toInt() << endl; //删除第0项并返回值
替换:
QJsonArray jArray= configJson->RootObj().value(“IP”).toArray();
jArray.insert(3,jArray); //ok
jArray.replace(3,jArray); //ok
jArray[4]= 12; //无效 数组越界无效
jArray[0]= 54; //ok
(*configJson->RootObjPointer())[“IP”]=jArray; //获取指针方式修改“IP”
configJson->savejsonfile();
QJsonObject
是否包含
是否包含Student
QJsonObject obj=doc.object();
if(obj.contains(“Student”))
{
}

/创建对象并转换成QByteArray/
QJsonObject rootobj;
rootobj[“sn”] = 20001;
rootobj[“type”] = “hub”;
QJsonDocument jsonDoc(rootobj);
QByteArray byte=jsonDoc.toJson(); //按照json风格生成字符串,自动缩进,有空格和\n \t ; 数据量大
QByteArray byte=jsonDoc.toJson(QJsonDocument::Compact);//传入参数获取压缩后的序列化结果,紧凑格式,直接生成一堆字符串,但是占用控件小

/QByteArray转换成QJsonDocument,并得到数据/
QJsonDocument jsonDoc1 = QJsonDocument::fromJson(byte); //QByteArray转换成文档对象
QJsonObject obj1 = jsonDoc1.object();
qDebug() << “obj1=” << obj1[“sn”].toInt() << obj1[“type”].toString() << endl;

插入
jsonObject.insert(“name”, QString::number(i+1));
jsonObject.insert(“age”, i+18);
jsonObject.insert(“time”, QDateTime::currentDateTime().toString());

json说明
/*【】是用来填充数据使用 /
(configJson->RootObjPointer())[“IP”]=jArray;
/
.value 这种方式是用来获取数据
/
(*configJson->RootObjPointer()).value(“IP”)=jArray;

json注意事项:
数组中不能是00 “NightMode”: [18, 00, 0, 6, 0, 0] //解析不出来
数组中是int类型的数据 不要用QString 去替换,会不成功。
修改json类型要修改他的指针,重新填充数据要重新赋值给上层的父类,保存才能达到效果,不能获取的只是临时变量。(如下例子)

QJsonArray jArray= configJson->RootObj().value(“IP”).toArray();
jArray[4]= 12; //无效 (数组越界 )
jArray.insert(3,jArray); //ok (可以插入任意类型 )
jArray.replace(3,jArray); //ok (可以替换任意类型 )
jArray[0]= 54; //ok (数组不越界 )
(*configJson->RootObjPointer())[“IP”]=jArray; //Ok (通过指针来获取“IP”,并赋值)
configJson->savejsonfile();

案例1:

QString fileName = QCoreApplication::applicationDirPath();
fileName+=“/pdoctor.json”;
doctorjson = new Json(fileName);
QJsonArray doctor = doctorjson->Obj()[“data”].toArray();
int row = doctor.count();
for (int i=0;i {
}
doctor.at(i).toObject()[“advice”].toObject()[“adviceSeq”].toInt();
doctor.at(i).toObject()[“advice”].toObject()[“drugName”].toString();
doctor.at(i).toObject()[“advice”].toObject()[“adviceType”].toInt();
doctor.at(i).toObject()[“advice”].toObject()[“freq”].toString();
doctor.at(i).toObject()[“advice”].toObject()[“drugvolume”].toDouble();
doctor.at(i).toObject()[“advice”].toObject()[“drugDensity”].toDouble();

案例2:

案例3:

/*****************************************************************************************/
QByteArray byte;
QFile file(file_path);
if(file.exists()){
file.open(QIODevice::ReadOnly|QIODevice::Text);
byte=file.readAll();
file.close();
}
else
{
cout<<“openFileError”< }
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsondocument::fromJson(byte,&json_error));
if(json_error.err!=QJsonParseError::NoError)
{
cout<<" json error "< }
QJsonObject rootobj=jsonDoc.object();
//一般需要使用 rootobj.contains(xxx) 判断一下是否存在 这里我们就默认是存在的 。

QJsonObject A_obj=rootobj.value(“A”).toObject();
A_obj[“AA”]=33;

QJsonArray B_array=rootobj.value(“B”).toArray();
QJsonObject B_Subobj=B_array[0].toObject();
QJsonArray b_array=B_Subobj.value(“BB”).toArray();
b_array.replace(0,“BBB”);
B_Subobj[“BB”]=b_array;
B_array.replace(0,B_Subobj);

QJsonObject C_obj=rootobj.value(“C”).toObject();
QJsonArray c_array=C_obj.value(“CC”).toArray();
c_array.replace(0,“CCC”);
C_obj[“CC”]=c_array;

rootobj[“A”]=A_obj;
rootobj[“B”]=B_array;
rootobj[“C”]=C_obj;

QFile file(file_path);
if(file.exists()){
file.open(QIODevice::WriteOnly|QIODevice::Text);
jsonDoc.setObject(rootobj);
file.seek(0);
file.write(jsonDoc.toJson());
file.flush();
file.close();
}

dock案例:
#include “json.h”

Json::Json(QString fileName)
{
jsonName=fileName;
openjsonfile(jsonName);
}

Json::~Json()
{
savejsonfile();
}

void Json::openjsonfile(QString name)
{
if(QFile::exists(name))
{
QByteArray byte;
QJsonDocument jsonDoc;
QFile file;
file.setFileName(name);
file.open(QFile::ReadOnly|QIODevice::Text);
byte= file.readAll();
jsonDoc = QJsonDocument::fromJson(byte);//转换成文档对象
if(jsonDoc.isObject()){ //判断文档对象中存储的数据是不是json对象
isfile = true;
rootobj = jsonDoc.object();//得到rootJson对象
file.close();
}
}else{
isfile = false;
}
}

void Json::savejsonfile()
{
QFile file;
QJsonDocument jsonDoc(rootobj); //将Json对象,转换成Json文档
// jsonDoc.setObject(rootobj);

file.setFileName(jsonName);
file.open(QFile::WriteOnly|QIODevice::Text);


file.seek(0);
file.write(jsonDoc.toJson());
file.flush();
file.close();

}

int Json::getKeyIntVal(QString key)
{
return rootobj[key].toInt();
}

QString Json::getKeyStringVal(QString key)
{
return rootobj[key].toString();
}

bool Json::getKeyBoolVal(QString key)
{
return rootobj[key].toBool();
}

//读取空值(因其没有对应的to类型函数,可使用下方类型接收或isNull()函数判断)
QVariant Json::getKeyVarialVal(QString key)
{
return rootobj[key].toVariant();
}

QJsonObject Json::getKeyQJsonObject(QString key)
{
return rootobj[key].toObject();
}

QJsonArray Json::getKeyQJsonArray(QString key)
{
return rootobj[key].toArray();
}

int Json::getArrayIndexIntVal(QString key, int index)
{
return rootobj[key].toArray().at(index).toInt();
}

QJsonObject Json::RootObj()
{
return rootobj;
}

QJsonObject* Json::RootObjPointer()
{
return &rootobj;
}

bool Json::getisfile()
{
return isfile;
}

void Json::insertKeyIntVal(QString key, int valu)
{
rootobj[key]=valu;
}

/*
*
*netjson->insertKeyBoolVal(“NightMode”,true); ok
*/
void Json::insertKeyBoolVal(QString key, bool valu)
{
rootobj[key]=valu;
}

/*
*netjson->insertKeyStringVal(“NightMode”,“opopopo”); Ok
*/
void Json::insertKeyStringVal(QString key, QString valu)
{
rootobj[key]=valu;
}

/*

  • QJsonArray c_JsArr;
  • c_JsArr.append(12);
  • c_JsArr.append(32);
  • netjson->insertKeyArrayVal(“NightMode”,c_JsArr); //Ok
    */
    void Json::insertKeyArrayVal(QString key, QJsonArray array)
    {
    rootobj[key]= array;
    }

/*

  • QJsonObject jsobject;
    jsobject[“opo”] = “qqqqqq”;
    jsobject[“op1”] = 12;
    jsobject[“op2”] = true;
    jsobject[“op3”] = “rrrrrr”;
    netjson->insertKeyObjectVal(“NightMode”,jsobject);

*/
void Json::insertKeyObjectVal(QString key, QJsonObject jsobject)
{
rootobj[key]=jsobject;
}

/*

  • netjson->replaceKeyArrayIndexVal(“NightMode”,5,10); //ok
    **/
    void Json::replaceKeyArrayIndexVal(QString key, int index, int valu) //valu 为 QString 不能替换
    {
    QJsonArray c_JsArr = rootobj.value(key).toArray();
    c_JsArr.replace(index,valu);
    rootobj[key]=c_JsArr;
    }

/* 数组里面添加QJsonArray

  • QJsonArray c_JsArr;
  • c_JsArr.append(12);
  • c_JsArr.append(32);
  • c_JsArr.replace(0,24); //替换
  • netjson->insertArrayKeyAddArrayVal(“NightMode”,0,c_JsArr);
    */

void Json::insertArrayKeyAddArrayVal(QString key, int index, QJsonArray valu)
{
QJsonArray c_JsArr = rootobj.value(key).toArray();
c_JsArr[index] = valu;
rootobj[key]=c_JsArr;
}

/*

  • 数组里面添加QJsonObject
  • QJsonObject jsobject;
  • jsobject[“opo”] = “qqqqqq”;
  • jsobject[“op1”] = 12;
  • jsobject[“op2”] = true;
  • jsobject[“op3”] = “rrrrrr”;
  • netjson->insertArrayKeyAddObjectVal(“NightMode”,0,jsobject);
    */
    void Json::insertArrayKeyAddObjectVal(QString key, int index, QJsonObject jsobject)
    {
    QJsonArray c_JsArr = rootobj.value(key).toArray();
    c_JsArr[index] = jsobject;
    rootobj[key]=c_JsArr;
    }

#ifndef JSON_H
#define JSON_H

#include
#include
#include
#include
#include
#include
#include
#include
#include

class Json
{
public:
Json(QString file);
~Json();

void openjsonfile(QString name);
void savejsonfile();
int getKeyIntVal(QString key);
QString getKeyStringVal(QString key);
bool getKeyBoolVal(QString key);
QVariant getKeyVarialVal(QString key);
QJsonArray  getKeyQJsonArray(QString key);
QJsonObject getKeyQJsonObject(QString key);
int getArrayIndexIntVal(QString key, int index);
QJsonObject RootObj();
QJsonObject* RootObjPointer();
bool getisfile();

//将键值对添加到Json对象中
void insertKeyIntVal(QString key,int valu);
void insertKeyBoolVal(QString key,bool valu);
void insertKeyStringVal(QString key,QString valu);
void insertKeyArrayVal(QString key,QJsonArray array);
void insertKeyObjectVal(QString key, QJsonObject jsobject);
void replaceKeyArrayIndexVal(QString key, int index, int valu);
void insertArrayKeyAddArrayVal(QString key, int index, QJsonArray valu);
void insertArrayKeyAddObjectVal(QString key, int index, QJsonObject jsobject);

private:
QString jsonName;
QJsonObject rootobj;
bool isfile ;
};

#endif // JSON_H


■ Qt 语言家

  1. 运行 dos窗口

  2. 在pro文件中添加要生成的ts文件 例:ng96App_yue_EN.ts

  3. lupdate -verbose ng96App.pro //命令生成ts文件

  4. 将新生成的ts文件添加到工程中

  5. 编辑ts文件 翻译对应的文字信息保存
    7 .生成qm文件
    在create中 工具->外部->语言家->发布翻译

注意, 中文中ts文件代码中的文字信息没有提取到ts文件中,可以手动添加进去。

在游览器中有保存网址


  1. 在ng96App.pro 添加
    TRANSLATIONS +=
    EnglishChinese_zh_CN.ts
    EnglishChinese_zh_EN.ts

  2. 在ng96App.pro 添加
    DISTFILES +=
    EnglishChinese_zh_CN.ts

  3. 编译
    Ctrl+R

  4. 启动qt的命令行工具下执行生成相应的.ts 文件
    lupdate –verbose ng96App.pro //生成相应的.ts 文件

  5. 打开编辑ts文件,将英文翻译中文。如下:

    Run program 程序运行 Program management 程序管理
  6. QtCreat 工具 -> 外部 -> Qt语言家 -> 发布翻译 就生成看qm文件

  7. 将qm放在程序指定的加载目录下就能翻译。


■ Qt 软件盘

下载软键盘源代码
下载地址链接: https://download.qt.io/archive/qt/
根据自己的Qt版本下载,比如我的是Qt5.14,所以下载的是https://download.qt.io/archive/qt/5.14/5.14.0/submodules/下的qtvirtualkeyboard-everywhere-src-5.14.0.tar.xz文件

T9键盘例子
文件位子在科芯U盘数字键盘目录

设置输入法限制
//设置禁用输入
ui->txt1->setProperty(“noinput”, true);

//设置只读属性,不会弹出输入法
ui->lineEdit->setReadOnly(true);

//设置主动弹出数字键盘,如果是QSpinBox控件无需设置该属性,会自动识别改成数字模式
ui->txt2->setProperty(“flag”, “number”);

//设置表格控件中的所有子控件为数字键盘
ui->tableWidget->setProperty(“flag”, “number”);
input2019

//设置禁用输入
ui->txt1->setProperty(noinput, true);

//绑定全局改变焦点信号槽
connect(qApp, SIGNAL(focusChanged(QWidget *, QWidget *)), this, SLOT(focusChanged(QWidget *, QWidget *)));
qApp->installEventFilter(this);

void frmInput2019::sendEvent(quint8 type, const QString &text)
{
if (type == 0) {
//切换中英模式
QMouseEvent mousePress(QEvent::MouseButtonPress, QPoint(0, 0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
QApplication::sendEvent(ui->labType->isVisible() ? ui->labType : ui->labType2, &mousePress);
} else if (type == 1) {
//隐藏汉字候选面板
QMouseEvent mousePress(QEvent::MouseButtonPress, QPoint(0, 0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
QApplication::sendEvent(ui->labMore, &mousePress);
} else if (type == 2) {
//删除
QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier, QString());
QApplication::sendEvent(currentWidget, &keyPress);
} else if (type == 3) {
//插入回车符
QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier, QString(“\n”));
QApplication::sendEvent(currentWidget, &keyPress);
} else if (type == 4) {
//插入字符
QKeyEvent keyPress(QEvent::KeyPress, 0, Qt::NoModifier, QString(text));
QApplication::sendEvent(currentWidget, &keyPress);
}
}


■ Qt Creator

■ Qt pro文件点击打不开

可能的解决办法:
删除~\AppData\Roaming\QtProject文件夹,然后再打开Qt Creator即可。
Linux下,~是/home/YourUserName
Windows下,~是:\Users\YourUserName (C:\Users\Administrator\AppData\Roaming\QtProject)

通过路径添加子文件内容

如dockTopApp中加入sound文件夹

  1. 在dockTopApp.pro中添加包含子目录的文件夹和pri文件。

INCLUDEPATH += KaTeX parse error: Expected 'EOF', got '#' at position 27: … #̲通过路径添加子文件内容 inc…PWD/sound/sound.pri) #添加子文件夹所需pri文件

  1. 在工程目录下新建sound目录。 将需要放进来的文件拷贝到sound目录下。

  2. 修改sound目录下的sound.prl文件

注意:如果是其他地方拷贝过来的cpp h ui文件,需要再其他地方的pro文件中清除包含关系。
编译不过的话就重新构建一下。

■ Qt版本发布

  1. 生成Release版本。LordCard.exe.
    2,查看windeployqt.exe所在目录。
    E:\install\Qt\Qt5.14.2\5.14.2\mingw73_64\bin\windeployqt.exe
    如果已经将这个路径设置到环境变量中了,那么在当前操作系统的任意目录下都可以访问 windeployqt.exe
    3, 新建文件夹 landlord 将生成的LordCard.exe放在该目录下。
    进入到这个目录,按住键盘 shift键然后鼠标右键就可以弹出一个右键菜单 用Powershell 窗口

这样 LordCard.exe 需要的动态库会被全部拷贝到当前的目录中,如下图:


■ windows常见的DOS命令

(1)什么是DOS
“Disk Operating System” 的缩写是DOS,中文含义为“磁盘操作系统”
DOS是单用户、单任务的操作系统。
DOS命令直接面向磁盘
(2)常见命令
1、进入控制命令台:win+r —> cmd
2、磁盘切换:d: e: (直接输入盘符和冒号,然后回车,不区分大小写)
3、显示文件目录:dir (显示当前盘符的文件目录)
4、改变当前目录:cd 文件夹名
5、当前目录:cd. 返回上一级目录:cd…
6、清屏命令:cls
7、切换历史命令:上下箭头
8、补全命令:tab
9、创建目录:md 目录名 删除目录:rd 目录名
10、复制命令:copy a1 a2 (将a1文件内容复制到a2文件中)
11、删除文件:del 文件/目录名 (当删除的是目录时,那么删除是目录下的文件,而不是该目录)



  1. 1-5 ↩︎

你可能感兴趣的:(qt,数据库,开发语言)