Qt-窗口布局&按钮&输入类

1. 窗口布局

  • Qt 提供了很多摆放控件的辅助工具(又称布局管理器或者布局控件),它们可以完成两件事:

    • 自动调整控件的位置,包括控件之间的间距、对齐等;

    • 当用户调整窗口大小时,位于布局管理器内的控件也会随之调整大小,从而保持整个界面的美观。

  • Qt 共提供了4种布局管理器:

    • QVBoxLayout(垂直布局)

    • QHBoxLayout(水平布局)

    • QGridLayout(网格布局、栅格布局、棋盘布局)

    • QFormLayout(表单布局)

1.1 垂直和水平布局

 

常用函数:

  • layout -> addWidget(QWidget) : 向布局中添加部件

  • layout -> setSpacing(int) : 设置部件之间的距离

  • layout -> setDirection(QBoxLayout::LeftToRight) : 设置部件排列顺序

    • QBoxLayout::LeftToRight

    • QBoxLayout::RightToLeft

    • QBoxLayout::TopToBottom

    • QBoxLayout::BottomToTop

QPushButton *btn1 = new QPushButton("btn1");
QPushButton *btn2 = new QPushButton("btn2");
QPushButton *btn3 = new QPushButton("btn3");

ui->hl2->addWidget(btn1);
ui->hl2->addWidget(btn2);
ui->hl2->addWidget(btn3);
ui->hl2->setSpacing(30);
ui->hl2->setDirection(QBoxLayout::RightToLeft);

1.2 网格布局

对整个窗体进行布局有: 水平布局、垂直布局、栅格布局 三种。

栅格布局的特点:

  • 随着窗口大小的改变,里面的部件也会随之改变

  • 栅格布局中也能嵌套水平布局和垂直布局

动态调整部件的宽高  

1.3 表单布局

2. 按钮类

2.1 QPushButton

  • 常用按钮:可以设置成文字按钮、图片按钮、带下拉菜单的按钮

  • 设置成带下拉菜单按钮时需要配合 QMenu

// 一般按钮
ui->qBtn1->resize(80, 40);

// 图片按钮
ui->qBtn2->resize(80, 40);
ui->qBtn2->setIcon(QIcon(":/images/ashe.jpg"));
ui->qBtn2->setIconSize(QSize(32, 32));

// 图文按钮
ui->qBtn3->resize(80, 40);
ui->qBtn3->setText("狗头");


// 下拉菜单按钮
ui->qBtn4->setText("选择学历");
ui->qBtn4->resize(80, 40);

// 下拉菜单
QMenu *degree = new QMenu;
degree->addAction("博士");
degree->addAction("硕士");
degree->addAction("本科");
degree->addAction("大专");
degree->addAction("高中");

// 将下拉菜单添加到按钮中
ui->qBtn4->setMenu(degree);

2.2 QToolButton

工具按钮:一般用于制作纯图按钮。 也可以设置成文字按钮 和 图片文字同时都有的按钮。如下图:

  • toolButtonStyle:图片和文字排列方式

  • autoRaise:按钮透明

ui->toolBtn1->setText("一般按钮");
ui->toolBtn1->resize(80, 40);
ui->toolBtn1->move(30, 80);


ui->toolBtn2->resize(80, 40);
ui->toolBtn2->move(130, 80);
ui->toolBtn2->setIconSize(QSize(60, 60));
ui->toolBtn2->setIcon(QIcon(":/images/jinx.jpg"));


// 图文按钮
ui->toolBtn3->setText("狗头");
ui->toolBtn3->resize(80, 40);
ui->toolBtn3->move(230, 80);
ui->toolBtn3->setIcon(QIcon(":/images/goutou.jpg"));
// 设置图片和文字的排列方式
ui->toolBtn3->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
// 设置是否取消边框
ui->toolBtn3->setAutoRaise(true);

2.3 Radio(单选框)

  • QRadioButton: 单选框

  • 若干个单选框需要设置为一个组才能实现单选效果

    • QHBoxLayout 使用水平布局进行分组

    • QGroup

// 单选框 -- 性别
connect(ui->male, &QRadioButton::clicked, [=](){
  gender = 1;
});
connect(ui->female, &QRadioButton::clicked, [=](){
  gender = 0;
});
connect(ui->unknown, &QRadioButton::clicked, [=](){
  gender = 2;
});
// 单选框 -- 学位
void Widget::on_r1_clicked()
{
    degreeStr = ui->r1->text();
    qDebug() << degreeStr;
}

void Widget::on_r2_clicked()
{
    degreeStr = ui->r2->text();
    qDebug() << degreeStr;
}

void Widget::on_r3_clicked()
{
    degreeStr = ui->r3->text();
    qDebug() << degreeStr;
}

void Widget::on_r4_clicked()
{
    degreeStr = ui->r4->text();
    qDebug() << degreeStr;
}

2.4 checkbox(复选框)

QCheckBox 类

  • 信号: stateChanged 当选择状态改变时触发

  • 注意事项: 复选框也需要使用 水平|垂直布局 或者 QGroup 归为一组

  • 复选框的半选状态

// 复选框
connect(ui->eatCheck, &QCheckBox::stateChanged, [=](){
  if(ui->eatCheck->isChecked())
  {
    hobbies.append("吃");
  }
  else
  {
    hobbies.removeAt(hobbies.indexOf("吃"));
  }

  qDebug() << hobbies;
});

connect(ui->drinkCheck, &QCheckBox::stateChanged, [=](){
  if(ui->drinkCheck->isChecked())
  {
    hobbies.append("喝");
  }
  else
  {
    hobbies.removeAt(hobbies.indexOf("喝"));
  }

  qDebug() << hobbies;
});

connect(ui->playCheck, &QCheckBox::stateChanged, [=](){
  if(ui->playCheck->isChecked())
  {
    hobbies.append("玩");
  }
  else
  {
    hobbies.removeAt(hobbies.indexOf("玩"));
  }

  qDebug() << hobbies;
});

connect(ui->happyCheck, &QCheckBox::stateChanged, [=](){
  if(ui->happyCheck->isChecked())
  {
    hobbies.append("乐");
  }
  else
  {
    hobbies.removeAt(hobbies.indexOf("乐"));
  }

  qDebug() << hobbies;
});

复选框的半选状态:

QCheckBox *c = new QCheckBox("半选", this);
c->setCheckState(Qt::PartiallyChecked);
c->move(320, 300);
connect(c, &QCheckBox::stateChanged, [=](){
  qDebug() << c->checkState();
});

2.5 按钮组

QButtonGroup 用来创建一个按钮组,内部可以包含多个按钮。

方法:

  • addButton(*btn, index) : 向按钮组中添加按钮。

    • 参数1 : 添加到按钮组中的按钮;

    • 参数2 : 添加到组中的索引号

信号:

  • buttonClicked(int index) : 点击按钮组中的按钮时触发,参数 int 保存点击的按钮的需要

class Widget : public QWidget
{
    Q_OBJECT

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

public slots:
    void btnGroupSlot(int index);

private:
    Ui::Widget *ui;
};
// 创建按钮组
QButtonGroup *btnGroup = new QButtonGroup(this);

// 向按钮组中添加按钮
btnGroup->addButton(ui->maleBtn, 0);
btnGroup->addButton(ui->femaleBtn, 1);
btnGroup->addButton(ui->unkownBtn, 2);

// 链接按钮组的信号和槽函数
connect(btnGroup, SIGNAL(buttonClicked(int)), this, SLOT(btnGroupSlot(int)));
void Widget::btnGroupSlot(int index)
{
    switch (index)
    {
    case 0:
        qDebug() << "男";
        break;
    case 1:
        qDebug() << "女";
        break;
    case 2:
        qDebug() << "未知";
        break;
    }
}

3. 输入类

3.1 QComboBox

QComboBox 用来设置下拉菜单

1.图形化设置

2)重要信号:

currentIndexChanged(int index) : 当选项发生改变时触发该信号,获取选中的索引号

void Widget::on_addrComBox_currentIndexChanged(int index)
{
    qDebug() << index;
}

3)常用方法:

  • addItem(QIcon, QString); 向下拉菜单中添加选项, QIcon 是可选参数

  • setCurrentIndex(index); 设置默认选中项

// 添加选项
ui->addrComBox->addItem("成都");
ui->addrComBox->addItem("重庆");

// 设置默认选中项
ui->addrComBox->setCurrentIndex(1);

案例: 批量向下拉菜单中添加数据,当选中某个选项时向控制台输出选中项数据

1) 头文件中声明数据类型 和 槽函数

// 头文件

// 声明数据结构
struct HeroStruct
{
    int heroId;
    QString heroName;
    QString heroIcon;
};

class Widget : public QWidget
{
	......

private slots:
 		// 槽函数
    void on_heroComboBox_currentIndexChanged(int index);

private:
    Ui::Widget *ui;
		// 数据变量声明
    QList<HeroStruct> heroList;
};
heroList = {
  {1, "金克斯", ":/images/jinx.jpg"},
  {3, "琴女", ":/images/qinnv.jpeg"},
  {7, "亚索", ":/images/yasuo.jpeg"}
};

// 循环添加
for(int i = 0; i < heroList.size(); i++)
{
  ui->heroComboBox->addItem(QIcon(heroList[i].heroIcon), heroList[i].heroName);
}
void Widget::on_heroComboBox_currentIndexChanged(int index)
{
    qDebug() << index << heroList[index].heroId << heroList[index].heroName;
}

3.2 QFontComboBox

QFontComboBox 是字体选择器,继承于 QComboBox

常用信号:

currentFontChanged(const QFont &font) : 选中字体发生改变时触发

void Widget::on_fontComboBox_currentFontChanged(const QFont &f)
{
    qDebug() << f.family();
}

 常用方法:

ui->fontComboBox->setCurrentFont(QFont("楷体"));

3.3 数字框

  • QSpinBox : 整型数字框

  • QDoubleSpinBox : 浮点型数字框

常用方法:

  • setMinimum(int) : 设置最小值

  • setMaximum(int) :设置最大值

  • setValue(int) : 设置当前值

  • setPrefix(QString) : 设置前缀

  • setSuffix(QString) : 设置后缀

  • setSingleStep(int) : 设置步进值

信号: 当值发生改变时触发

  • valueChanged(const QString &arg1)

  • valueChanged(int arg1)

图形化设置:

3.4 时间和日期

  • QDateTimeEdit :日期时间

  • QTimeEdit : 时间框 (继承于 QDateTimeEdit)

  • QDateEdit : 日期框 (继承于 QDateTimeEdit)

常用方法:

QDateTimeEdit(QDateTime) : 构造函数

dateTimeEdit(QDateTime) : 设置日期时间

setDisplayFormat(format) :设置日期格式

setCalendarPopup(bool) : 弹出日期选择器

QDateTime d = QDateTime::currentDateTime();
ui->dateTimeEdit->setDateTime(d);
// 利用构造函数
QDateTimeEdit *dt = new QDateTimeEdit(QDateTime(QDate(2023,10,10), QTime(9,10,20)), this);

dt->setDisplayFormat("yyyy-MM-dd HH:mm:ss");
dt->move(242, 110);

图形化设置:

3.5 QSlider

QSlider 滑动条

常用方法:

  • QSlider(水平|垂直, this);

    • Qt::Horizontal

  • setValue(int) : 设置当前值

  • setRange(min, max) : 设置值范围

  • setMinimum(int) / setMaximum(int) : 设置最小值和最大值

  • setTickPosition() : 设置是否是否有刻度

    • QSlider::NoTicks //不显示刻度

    • QSlider::TicksBothSides //标尺两侧都显示刻度

    • QSlider::TicksAbove //标尺上方显示刻度

    • QSlider::TicksBelow //标尺下方显示刻度

    • QSlider::TicksLeft //标尺左侧显示刻度

    • QSlider::TicksRight //标尺右侧显示刻度

  • setTickInterval(int) : 刻度间隔

QSlider *hs = new QSlider(Qt::Horizontal, this);
hs->resize(200, 20);
hs->move(30, 170);
hs->setRange(0, 200);
hs->setTickPosition(QSlider::TicksBelow);
hs->setTickInterval(50);

 图形化

信号: 拖动滚动条时触发

valueChanged(int value)

void Widget::on_hSlider_valueChanged(int value)
{
    qDebug() << value;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值