当前位置: 首页 > article >正文

输入类控件和多元素控件【QT】

输入类控件

QLineEdit

例如: 实现一个用户输入姓名 密码 电话 性别 的功能

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_submit_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->lineEdit_name->setPlaceholderText("请输入姓名");
     ui->lineEdit_name->setClearButtonEnabled(true) ;

     ui->lineEdit_password->setPlaceholderText("请输入密码");
      ui->lineEdit_password->setClearButtonEnabled(true) ;

        ui->lineEdit_password->setEchoMode(QLineEdit::Password) ; //让密码不回显

      ui->lineEdit_phone->setPlaceholderText("请输入电话");
       ui->lineEdit_phone->setClearButtonEnabled(true) ;
        //手机号码是有固定格式的 , 这里的0代表数字
        ui->lineEdit_phone->setInputMask("000-0000-0000") ;
}

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


void Widget::on_pushButton_submit_clicked()
{
           QString gender =  ui->radioButton_male->isChecked() ? "男" :"女";
           qDebug() << "姓名: " << ui->lineEdit_name->text()
                    << "密码: " << ui->lineEdit_password->text()
                    << "性别: " << gender
                    << "电话: " << ui->lineEdit_phone->text();


}

正则表达式:本质上就是一个带有特殊字符的字符串.特殊字符用来表示另一个字符串的特征.

此时就可以借助正则表达式来描述出一些具有一定特点的字符串

例如:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_lineEdit_textEdited(const QString &arg1);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QRegExpValidator>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //使用正则表达式来验证
    //这是一个简单的验证手机号码的正则表达式。 ^ 表示以 xxx 开头。 ^ 后面跟着的 1,意思就是以 1 开头。 \d 表示数字,为了在 C++ 字符串中使用,需要写作 \d {10} 表示前面的内容重复出现 10 次。\d 数字要重复出现 10 次。 $ 表示结尾了
    QRegExp regExp("^1\\d{10}$") ;
    ui->lineEdit->setValidator(new QRegExpValidator(regExp));
}

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


void Widget::on_lineEdit_textEdited(const QString &text)
{
    QString content = text;
    int pos =0 ;
    //验证通过
    if(ui->lineEdit->validator()->validate(content,pos )  ==QValidator::Acceptable   )

    {
    ui->pushButton->setEnabled(true) ;
    }

    //未验证通过
    else
    {
          ui->pushButton->setEnabled(false) ;
    }
}

根据QLineEdit控件实现一个功能:验证两次输入的密码一致

widget

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_lineEdit_textEdited(const QString &arg1);

    void on_lineEdit_2_textEdited(const QString &arg1);
     void compare() ;
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lineEdit->setEchoMode(QLineEdit::Password);
     ui->lineEdit_2->setEchoMode(QLineEdit::Password);
    //使用textEdited信号,来触发对于两个输入框内容的判定
     ui->label->setText("密码为空");
}

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


void Widget::on_lineEdit_textEdited(const QString &arg1)
{
   ( void)arg1 ; //这个写法对于代码的实际逻辑是没有任何影响的."骗过"编译器,警告就没了
    this->compare();

}

void Widget::on_lineEdit_2_textEdited(const QString &arg1)
{
    ( void)arg1 ; //这个写法对于代码的实际逻辑是没有任何影响的."骗过"编译器,警告就没了
     this->compare();
}

void Widget::compare()
{
const   QString  & s1 =  ui->lineEdit->text() ;
  const   QString  & s2 =  ui->lineEdit_2->text() ;
    if(s1.isEmpty() ==true   && s2.isEmpty()==true )
    {
        ui->label->setText("密码为空");
    }

    else if (s1 ==s2)
    {
         ui->label->setText("密码一致");
    }
    else
    {
        ui->label->setText("密码不一致");
    }
}

使用QLineEdit , 实现功能: 针对密码,可以切换“ 显示密码”状态

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_checkBox_toggled(bool checked);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

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

    ui->lineEdit->setEchoMode(QLineEdit::Password) ;
}

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


void Widget::on_checkBox_toggled(bool checked)
{
     if(checked ==true )
     {
          ui->lineEdit->setEchoMode(QLineEdit::Normal) ;
     }
     else
     {
          ui->lineEdit->setEchoMode(QLineEdit::Password) ;
     }


}

Text Edit

例1: 实现输入文字的功能

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_textEdit_textChanged();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

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

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


void Widget::on_textEdit_textChanged()
{
    const QString & text=   ui->textEdit->toPlainText();
    ui->label->setText(text) ;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例2: 实现输入文字的功能,且能够选中 ,能够撤销(ctrl +z),能够撤销之前的撤销(ctrl +y)

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_textEdit_textChanged();

    void on_textEdit_selectionChanged();

    void on_textEdit_cursorPositionChanged();

    void on_textEdit_undoAvailable(bool b);

    void on_textEdit_redoAvailable(bool b);

    void on_textEdit_copyAvailable(bool b);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

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


void Widget::on_textEdit_textChanged()
{
    qDebug()<<"textChanged :" <<ui->textEdit->toPlainText();
}

void Widget::on_textEdit_selectionChanged()
{
                        QTextCursor cursor = ui->textEdit->textCursor();
                         qDebug()<<"selectionChanged :" <<cursor.selectedText();
}

void Widget::on_textEdit_cursorPositionChanged()
{

    QTextCursor cursor = ui->textEdit->textCursor();
     qDebug()<<"cursorPositionChanged :" <<cursor.position();
}

void Widget::on_textEdit_undoAvailable(bool b)
{
 qDebug()<<"undoAvailable"<<b;
}

void Widget::on_textEdit_redoAvailable(bool b)
{
qDebug()<<"redoAvailable"<<b;
}

void Widget::on_textEdit_copyAvailable(bool b)
{
qDebug()<<"copyAvailable"<<b;
}

Combo Box

例如:实现麦当劳点餐界面

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->comboBox->addItem("麦辣鸡腿堡");
    ui->comboBox->addItem("巨无霸");
    ui->comboBox->addItem("培根蔬萃双层牛堡");

    ui->comboBox_2->addItem("中薯条");
    ui->comboBox_2->addItem("麦乐鸡块");
    ui->comboBox_2->addItem("麦辣鸡翅");

    ui->comboBox_3->addItem("可乐");
    ui->comboBox_3->addItem("雪碧");
}

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


void Widget::on_pushButton_clicked()
{
qDebug()<<ui->comboBox->currentText()<<" , " <<ui->comboBox_2->currentText()<<" , " <<ui->comboBox_3->currentText();
}

或者通过ui界面的方式来添加麦辣鸡腿堡

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例2:读取文件内容,把文件中的每一行读取出来,作为一个ComboBox的选项

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<fstream>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //读取文件内容,把文件中的每一行读取出来,作为一个ComboBox的选项

    //如何理解文件流的输入和输出
    //文件流的输入和输出一般是考虑在CPU的视角中,从文件/磁盘将数据输入到CPU中 ,从CPU中输出数据到硬盘/文件

    std::ifstream file("C:/Users/cxq/Desktop/leetcode.txt");


    if(file.is_open() ==false)

    {
        qDebug()<<"file open error" ;
        return ;
    }
    //换行读取文本内容
    std::string line ;
    while(std::getline (file ,line) )
    {
        //把文件中的每一行读取出来,作为一个ComboBox的选项

        ui->comboBox->addItem(QString::fromStdString(line));

    }

    file.close() ;

}

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


Spin Box

例如:实现点餐界面功能

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->comboBox->addItem("麦辣鸡腿堡");
    ui->comboBox->addItem("巨无霸");
    ui->comboBox->addItem("培根蔬萃双层牛堡");

    ui->comboBox_2->addItem("中薯条");
    ui->comboBox_2->addItem("麦乐鸡块");
    ui->comboBox_2->addItem("麦辣鸡翅");

    ui->comboBox_3->addItem("可乐");
    ui->comboBox_3->addItem("雪碧");

    ui->spinBox->setRange(1,5) ;
     ui->spinBox_2->setRange(1,5) ;
      ui->spinBox_3->setRange(1,5) ;



              ui->spinBox->setValue(1) ;
               ui->spinBox_2->setValue(1) ;
                ui->spinBox_3->setValue(1) ;
}

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


void Widget::on_pushButton_clicked()
{
qDebug()<<ui->comboBox->currentText()<<" , " <<ui->comboBox_2->currentText()<<" , " <<ui->comboBox_3->currentText();
qDebug()<<ui->spinBox->value()<<" , " <<ui->spinBox_2->value()<<" , " <<ui->spinBox_3->value();
}

# Date Edit  && Time Edit 

例如:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

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


void Widget::on_pushButton_clicked()
{

     QDateTime timeOld =  ui->dateTimeEdit->dateTime();
       QDateTime timeNew =  ui->dateTimeEdit_2->dateTime();
       qDebug()<<timeOld<<timeNew;

       //计算日期的差值


  //计算秒数的差值
         int seconds =timeOld.secsTo(timeNew);
            int hours = (seconds/3600) %24;
              qDebug()<<hours<<timeNew;
              //  int days =timeOld.daysTo(timeNew);
              int days =(seconds/3600)/24;
                    qDebug()<<days<<timeNew;

              ui->label->setText(QString::number(hours)) ;
}

Dial

例如: 通过旋钮控制窗口的不透明度

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_dial_valueChanged(int value);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

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


void Widget::on_dial_valueChanged(int value)
{
    qDebug()<<value;
    //不透明度的取值范围是 0到1  , 0为完全透明 ,1 为完全不透明
    //通过打印value的值 , 发现value值是 0到100 ,所以需要除以100
    this->setWindowOpacity((double)value/100) ;
}

Slider

例如:

在窗口上放两个滑动条,一个是水平,垂直.滑动这两个滑动条,就能够调整窗口的大小

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_verticalSlider_valueChanged(int value);

    void on_horizontalSlider_valueChanged(int value);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QRect>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->horizontalSlider->setMinimum(100) ;
    ui->horizontalSlider->setMaximum(2000) ;
    ui->horizontalSlider->setValue(800) ;
      ui->horizontalSlider->setSingleStep(50) ;

      ui->verticalSlider->setMinimum(100) ;
      ui->verticalSlider->setMaximum(1500) ;
      ui->verticalSlider->setValue(600) ;
        ui->verticalSlider->setSingleStep(50) ;

}

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


void Widget::on_verticalSlider_valueChanged(int value)
{
     const  QRect & rect =  this->geometry();
      this->setGeometry(rect.x() ,rect.y() , rect.width(),value ) ;

}

void Widget::on_horizontalSlider_valueChanged(int value)
{
    const  QRect & rect =  this->geometry();
     this->setGeometry(rect.x() ,rect.y() , value,rect.height() ) ;
}

例2:

自定义快捷键,通过快捷键来操作滑动条.

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_horizontalSlider_valueChanged(int value);
    void SubValue();
     void AddValue();
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QShortcut>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建+ 和 - 的快捷键, = 和+ 属于同一个键位
    QShortcut *     shortCut1 = new QShortcut (this) ;
    shortCut1->setKey(QKeySequence("-" ) )  ;
      QShortcut *     shortCut2 = new QShortcut (this) ;
       shortCut2->setKey(QKeySequence("=" ) )  ;

       //信号槽
          connect (shortCut1 ,&QShortcut::activated , this , &Widget::SubValue);
          connect (shortCut2 ,&QShortcut::activated , this , &Widget::AddValue);
}

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


void Widget::on_horizontalSlider_valueChanged(int value)
{
    ui->label->setText(QString::number(value));
}

void Widget::SubValue()
{
    int value = ui->horizontalSlider->value();
    if(value <= ui->horizontalSlider->minimum())
    {
        return ;
    }
    ui->horizontalSlider->setValue(value-5) ;
}

void Widget::AddValue()
{
    int value = ui->horizontalSlider->value();
    if(value >= ui->horizontalSlider->maximum())
    {
        return ;
    }
    ui->horizontalSlider->setValue(value+5) ;
}

多元素控件

QListWidget

例如:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QListWidgetItem>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_insert_clicked();

    void on_pushButton_delete_clicked();

    void on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->listWidget->addItem("java");
     ui->listWidget->addItem("c++");
       ui->listWidget->addItem("go");


       //在 QListWidgetItem中,可以设置字体属性,设置图标,设置文字大小,设置是否被选中等状态
       //第二种添加listWidget方式:
         ui->listWidget->addItem(new QListWidgetItem("c#") );



}

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


void Widget::on_pushButton_insert_clicked()
{
    //获取lineEdit输入框的内容, 添加到listWidget中
   const QString & text =  ui->lineEdit->text();
   ui->listWidget->addItem(text) ;
}

void Widget::on_pushButton_delete_clicked()
{
  //获取被选中的元素位置
    int row  = ui->listWidget->currentRow();
    if(row<0)  //位置不存在
    {
        return ;
    }
    //根据元素位置删除对应的元素
    ui->listWidget->takeItem(row);

}

void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
  if(current!=nullptr)
  {
      qDebug()<<"当前元素:"<<current->text();
  }
  if(previous!=nullptr)
  {
      qDebug()<<"上一个元素"<<previous->text();
  }
}

TableWidet

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_insertRow_clicked();

    void on_pushButton_insertColumn_clicked();

    void on_pushButton_deleteRow_clicked();

    void on_pushButton_deleteColumn_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lineEdit->setText("");

    //创建三行三列
    ui->tableWidget->insertRow(0);
       ui->tableWidget->insertRow(1);
          ui->tableWidget->insertRow(2);

          ui->tableWidget->insertColumn(0);
             ui->tableWidget->insertColumn(1);
                ui->tableWidget->insertColumn(2);
     //设置水平方向的表头
                ui->tableWidget->setHorizontalHeaderItem(0 , new QTableWidgetItem("学号"));
                  ui->tableWidget->setHorizontalHeaderItem(1 , new QTableWidgetItem("姓名"));
                    ui->tableWidget->setHorizontalHeaderItem(2 , new QTableWidgetItem("年龄"));

        //向表格中添加数据
                   ui->tableWidget->setItem(0,0,new QTableWidgetItem("1001"));
                  ui->tableWidget->setItem(0,1,new QTableWidgetItem("张三"));
                    ui->tableWidget->setItem(0,2,new QTableWidgetItem("20"));

                    ui->tableWidget->setItem(1,0,new QTableWidgetItem("1001"));
                   ui->tableWidget->setItem(1,1,new QTableWidgetItem("张三"));
                     ui->tableWidget->setItem(1,2,new QTableWidgetItem("20"));

                     ui->tableWidget->setItem(2,0,new QTableWidgetItem("1001"));
                    ui->tableWidget->setItem(2,1,new QTableWidgetItem("张三"));
                      ui->tableWidget->setItem(2,2,new QTableWidgetItem("20"));
}

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


void Widget::on_pushButton_insertRow_clicked()
{
    //当前一共多少行
    int rowcount = ui->tableWidget->rowCount();
    //在最后一行之后新增新行
    //注意:  此处的参数是“下标",表示你新增之后的这一行是第几行
    qDebug()<<"rowcount: "<<rowcount;
    ui->tableWidget->insertRow(rowcount) ;
}

void Widget::on_pushButton_insertColumn_clicked()
{
    //获取当前一共多少列
    int colCount = ui->tableWidget->columnCount();
    //新增列
    ui->tableWidget->insertColumn(colCount);
    //设置列名,列名从输入框中获取
   const  QString & text = ui->lineEdit->text();
    ui->tableWidget->setHorizontalHeaderItem(colCount, new QTableWidgetItem(text)) ;

}

void Widget::on_pushButton_deleteRow_clicked()
{
    //获取选中的行号
   int curRow = ui->tableWidget->currentRow();
    ui->tableWidget->removeRow(curRow);
}

void Widget::on_pushButton_deleteColumn_clicked()
{
    //获取选中的行号
   int curColumn = ui->tableWidget->currentColumn();
    ui->tableWidget->removeColumn(curColumn);
}

TreeWidget

TreeWidget不是从根节点开始添加或删除节点 , 可以理解为没有根节点 ,从第二层开始添加或删除节点

TreeWidget的顶层节点是第二层开始计算的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_insertTopItem_clicked();

    void on_pushButton_insertItem_clicked();

    void on_pushButton_deleteItem_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->treeWidget->setHeaderLabel("动物"); //设置表头

    //新增顶层节点
    QTreeWidgetItem * item1  = new QTreeWidgetItem() ;
    //每个节点都可以设置多个列
    item1->setText(0 ,"猫");
    ui->treeWidget->addTopLevelItem(item1);

    QTreeWidgetItem * item2  = new QTreeWidgetItem() ;
    //每个节点都可以设置多个列
    item2->setText(0 ,"狗");
    ui->treeWidget->addTopLevelItem(item2);

    QTreeWidgetItem * item3  = new QTreeWidgetItem() ;
    //每个节点都可以设置多个列
    item3->setText(0 ,"鸟");
    ui->treeWidget->addTopLevelItem(item3);

    //添加子节点

     QTreeWidgetItem * item4  = new QTreeWidgetItem() ;
         item4->setText(0,"中华田园猫");
         item1->addChild(item4) ;

         QTreeWidgetItem * item5  = new QTreeWidgetItem() ;
             item5->setText(0,"猫2");
             item1->addChild(item5) ;
             QTreeWidgetItem * item6  = new QTreeWidgetItem() ;
                 item6->setText(0,"猫3");
                 item1->addChild(item6) ;




}

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


void Widget::on_pushButton_insertTopItem_clicked()   //插入顶层节点
{



    //获取输入框的内容
    const QString & text = ui->lineEdit->text() ;
    //构造一个QTreeWidgetItem
    QTreeWidgetItem * item  = new QTreeWidgetItem () ;
    item->setText(0,text);
    //  添加到顶层节点中
    ui->treeWidget->addTopLevelItem(item) ;
}

void Widget::on_pushButton_insertItem_clicked()  //插入到选中节点的子节点中
{
    //获取当前选中的节点
    QTreeWidgetItem * currentItem  = ui->treeWidget->currentItem();
    if(currentItem ==nullptr)
    {
        return ;
    }

    //获取输入框的内容
    const QString & text = ui->lineEdit->text() ;
    //构造一个QTreeWidgetItem
    QTreeWidgetItem * item  = new QTreeWidgetItem () ;
     item->setText(0,text);
     //  插入到选中节点的子节点中
     currentItem->addChild(item) ;
}

void Widget::on_pushButton_deleteItem_clicked()
{
  //获取选中的元素
    QTreeWidgetItem * currentItem   = ui->treeWidget->currentItem();
    if(currentItem ==nullptr)
    {
        return ;
    }

    //删除选中的元素,首先需要获取其父元素, 通过父元素进行删除
              QTreeWidgetItem * parent =     currentItem->parent();
      //顶层元素
        if(parent ==nullptr)
        {
             int index = ui->treeWidget->indexOfTopLevelItem(currentItem) ;
             ui->treeWidget->takeTopLevelItem(index);
        }
        //普通元素
        else
        {
            parent->removeChild(currentItem);
        }

}

QGroupBox

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->comboBox->addItem("麦辣鸡腿堡");
    ui->comboBox->addItem("巨无霸");
      ui->comboBox->addItem("培根蔬萃双层牛堡");

      ui->comboBox_2->addItem("中薯条");
      ui->comboBox_2->addItem("麦乐鸡块");
        ui->comboBox_2->addItem("麦辣鸡翅");

        ui->comboBox_3->addItem("可乐");
        ui->comboBox_3->addItem("雪碧");
          ui->comboBox_3->addItem("咖啡");
}

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


Tab Widget

创建一个程序,带有一个TableWidget 作为标签页.
提供两个按钮,分别创建新的标签页,关闭当前选中的标签页.当切换标签页的时候,也能感知到变化.

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_tabWidget_currentChanged(int index);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QLabel>
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //在每个标签页中添加一个label
    QLabel * label = new QLabel(ui->tab) ;
    label->setText("标签页1");
    label->resize(100,50) ;

    QLabel * label2 = new QLabel(ui->tab_2) ;
    label2->setText("标签页2");
    label2->resize(100,50) ;
}

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


void Widget::on_pushButton_clicked()  //增加标签页
{
  //addTab参数
    //参数1:指定一个QWidget
    //参数2:指定这个标签页的名字
    QWidget * w = new QWidget() ;
    int count = ui->tabWidget->count();
    ui->tabWidget->addTab(w ,QString("Tab") + QString::number(count+1)) ; //count是标签页的下标

    //添加
    QLabel * label   = new QLabel(w) ;
    label->setText(QString("标签页") +QString::number(count+1));

    label->resize(100,50) ;
    //设置新标签页被选中
    ui->tabWidget->setCurrentIndex(count) ;
}

void Widget::on_pushButton_2_clicked()  //删除标签页
{
  //获取选中的标签页的下标
   int index = ui->tabWidget->currentIndex() ;

   //删除
   ui->tabWidget->removeTab(index) ;
}{
qDebug() <<index;
}

void Widget::on_tabWidget_currentChanged(int index)


# QVBoxLayout

Qt中提供了很多种布局管理器

  1. 垂直布局
  2. 水平布局
  3. 网格布局
  4. 表单布局

每个widget中只能设置一个布局管理器.

例如:垂直布局

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QVBoxLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建三个按钮,使用垂直布局管理器管理
    QPushButton*button1 = new QPushButton("button1");
       QPushButton*button2 = new QPushButton("button2");
          QPushButton*button3 = new QPushButton("button3");
    //创建布局管理器
    QVBoxLayout * layout = new QVBoxLayout() ;
    layout->addWidget(button1);
    layout->addWidget(button2);
    layout->addWidget(button3);
    //将布局管理器添加到窗口中
    this->setLayout(layout);
}

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


如果在代码中创建layout,其实是只创建了一个layout.
如果在QtDesigner中创建的 layout,先创建了一个Widget,然后再在这个新的 Widget中添加了一个layout.

# QHBoxLayout

嵌套管理器

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QHBoxLayout>
#include<QVBoxLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 创建2个按钮,使用垂直布局管理器管理
    QVBoxLayout * vlayout = new QVBoxLayout ( ) ;
    QPushButton*button1 = new QPushButton("button1");
          QPushButton*button2 = new QPushButton("button2");
    vlayout->addWidget(button1) ;
    vlayout->addWidget(button2) ;


       // 创建2个按钮,使用水平布局管理器管理


    QVBoxLayout * hlayout = new QVBoxLayout ( ) ;
    QPushButton*button3= new QPushButton("button3");
          QPushButton*button4 = new QPushButton("button4");
    hlayout->addWidget(button3) ;
    hlayout->addWidget(button4) ;

    // 把水平布局管理器添加到垂直布局管理器内部
    vlayout->addLayout(hlayout);


    //将垂直布局管理器添加到窗口中
  this->setLayout(vlayout);

}

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


QGridLayout

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QGridLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建4个按钮
    QPushButton*button1 = new QPushButton("button1");
            QPushButton*button2 = new QPushButton("button2");
            QPushButton*button3 = new QPushButton("button3");
                    QPushButton*button4 = new QPushButton("button4");

                    //创建网格布局管理器
                      QGridLayout*layout = new QGridLayout();
                      layout->addWidget(button1);
                         layout->addWidget(button2);
                         layout->addWidget(button3);
                            layout->addWidget(button4);

//                            layout->addWidget(button1, 0, 0);
//                            layout->addWidget(button2, 0, 1);
//                            layout->addWidget(button3, 1, 0);
//                            layout->addWidget(button4, 1, 1);

                            // 这个写法就相当于水平布局了
                            // 此时大家的行数只要是一样的即可,不一定非得是0
//                            layout->addWidget(button1, 0, 0);
//                            layout->addWidget(button2, 0, 1);
//                            layout->addWidget(button3, 0, 2);
//                            layout->addWidget(button4, 0, 3);

                            // 这个写法就相当于垂直布局了
                            layout->addWidget(button1, 0, 0);
                            layout->addWidget(button2, 1, 0);
                            layout->addWidget(button3, 2, 0);
                            layout->addWidget(button4, 3, 0);

                            // 这种写法是每个按钮独占一行和一列
                            // 即使设置成 100, 100, 也不会在中间搞出很大的空白空间。
                            // 此处设置的行数和列数,只是用来决定控件之间的相对位置。
//                            layout->addWidget(button1, 0, 0);
//                            layout->addWidget(button2, 1, 1);
//                            layout->addWidget(button3, 2, 2);
//                            layout->addWidget(button4, 100, 100);


                     //将布局管理器添加到窗口中
                      this->setLayout(layout);
}

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


例2:

设置水平拉伸系数

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QGridLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);


    // 创建 6 个按钮,使用网格布局按照 2 * 3 的方式来排列
    QPushButton* button1 = new QPushButton("按钮1");
    QPushButton* button2 = new QPushButton("按钮2");
    QPushButton* button3 = new QPushButton("按钮3");
    QPushButton* button4 = new QPushButton("按钮4");
    QPushButton* button5 = new QPushButton("按钮5");
    QPushButton* button6 = new QPushButton("按钮6");

    // 创建网格布局管理器,把这些控件添加进去
    QGridLayout* layout = new QGridLayout();
    layout->addWidget(button1, 0, 0);
    layout->addWidget(button2, 0, 1);
    layout->addWidget(button3, 0, 2);
    layout->addWidget(button4, 1, 0);
    layout->addWidget(button5, 1, 1);
    layout->addWidget(button6, 1, 2);

    //将布局管理器添加到窗口中

    this->setLayout(layout);

    // 设置水平拉伸系数
    layout->setColumnStretch(0, 1);
    layout->setColumnStretch(1, 1);
    layout->setColumnStretch(2, 2);
}

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


QFormLayout

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QGridLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

// 设置成 3 行 2 列。
QFormLayout* layout = new QFormLayout();
this->setLayout(layout);

// 创建 3 个 label 作为第一列
QLabel* label1 = new QLabel("姓名");
QLabel* label2 = new QLabel("年龄");
QLabel* label3 = new QLabel("电话");

// 创建 3 个 输入框 作为第二列
QLineEdit* edit1 = new QLineEdit();
QLineEdit* edit2 = new QLineEdit();
QLineEdit* edit3 = new QLineEdit();

// 把上述控件添加到表单布局中
layout->addRow(label1, edit1);
layout->addRow(label2, edit2);
layout->addRow(label3, edit3);

// 创建一个 "提交按钮"
QPushButton* button = new QPushButton("提交");
layout->addRow(nullptr, button);

}

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

http://www.kler.cn/a/534377.html

相关文章:

  • 通过C/C++编程语言实现“数据结构”课程中的链表
  • 【C++】STL——list底层实现
  • 并发编程 - 线程同步(三)之原子操作Interlocked简介
  • 【C++】STL——vector底层实现
  • Verilog语言学习总结
  • 保姆级教程Docker部署Zookeeper官方镜像
  • 使用Selenium和Jsoup框架进行Java爬虫
  • vue中嵌入iframe
  • 【BUUCTF杂项题】荷兰宽带数据泄露、九连环
  • Houdini subuv制作输出阵列图
  • 如何使用 Python 和 SQLAlchemy 结合外键映射来获取其他表中的数据
  • OpenCV:特征检测总结
  • k8s服务发现有哪些方式?
  • 【产品小白】什么是微服务
  • 基于微信小程序的课堂点名系统springboot+论文源码调试讲解
  • AURIX TC275学习笔记3 官方例程 (UART LED WDT)
  • mysql和oracle取Group By 第一条
  • AI推理性能之王-Groq公司开发的LPU芯片
  • vue 弹窗 模板
  • 人工智能|本地部署|ollama+chatbox快速Windows10下部署(初级篇)
  • 深度剖析 Veo2 工具:解锁 AI 视频创作新境界
  • RabbitMQ 可靠性投递
  • 理解 C 与 C++ 中的 const 常量与数组大小的关系
  • 【C++】STL——list的使用
  • 【数据结构】链表应用1
  • java中反射(Reflection)的4个作用