QBoxLayout
能支持水平布局和垂直布局,
然而键盘的左侧字母区,
键盘大小参差不齐,
用盒子布局再适合不过了。
1 成品示例

2 代码实现
为了使键盘能支持放大缩小,
且能保持键盘的布局不乱,
所以代码中用了满满当当的stretch
且看代码实现:
cpp
// 第一行
QHBoxLayout *hBox0 = new QHBoxLayout;
hBox0->setMargin(0);
hBox0->setSpacing(0);
QStringList line0 = {"ESC", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12"};
for (int i = 0; i < line0.size(); ++i)
{
QPushButton *btn = new QPushButton(line0.at(i));
btn->setMinimumSize(60,60);
btn->setMaximumSize(6000,6000);
hBox0->addWidget(btn, 2);
if(line0.at(i) == "ESC")
hBox0->addStretch(2);
else if(line0.at(i) == "F4" || line0.at(i) == "F8")
hBox0->addStretch(1);
}
//第二行
QHBoxLayout *hBox1 = new QHBoxLayout;
hBox1->setMargin(0);
hBox1->setSpacing(0);
QStringList line1 = {"`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0","-","=","←"};
for (int i = 0; i < line1.size(); ++i)
{
QPushButton *btn = new QPushButton(line1.at(i));
btn->setMinimumSize(60,60);
btn->setMaximumSize(6000,6000);
if(i != line1.size() - 1)
hBox1->addWidget(btn, 1);
else
hBox1->addWidget(btn, 2);
}
//第三行
QHBoxLayout *hBox2 = new QHBoxLayout;
hBox2->setMargin(0);
hBox2->setSpacing(0);
QStringList line2 = {"Tab", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P","[","]","\\"};
for (int i = 0; i < line2.size(); ++i)
{
QPushButton *btn = new QPushButton(line2.at(i));
btn->setMinimumSize(60,60);
btn->setMaximumSize(6000,6000);
if(line2.at(i) == "Tab" || line2.at(i) == "\\")
hBox2->addWidget(btn, 3);
else
hBox2->addWidget(btn, 2);
}
//第四行
QHBoxLayout *hBox3 = new QHBoxLayout;
hBox3->setMargin(0);
hBox3->setSpacing(0);
QStringList line3 = {"Caps Lock", "A", "S", "D", "F", "G", "H", "J", "K", "L", ";", ".", "Enter"};
for (int i = 0; i < line3.size(); ++i)
{
QPushButton *btn = new QPushButton(line3.at(i));
btn->setMinimumSize(60,60);
btn->setMaximumSize(6000,6000);
if(line3.at(i) == "Caps Lock")
hBox3->addWidget(btn, 21);
else if(line3.at(i) == "Enter")
hBox3->addWidget(btn, 26);
else
hBox3->addWidget(btn, 12);
}
//第五行
QHBoxLayout *hBox4 = new QHBoxLayout;
hBox4->setMargin(0);
hBox4->setSpacing(0);
QStringList line4 = {"Shift", "Z", "X", "C", "V", "B", "N", "M", ",", ".", "/", "Shift"};
for (int i = 0; i < line4.size(); ++i)
{
QPushButton *btn = new QPushButton(line4.at(i));
btn->setMinimumSize(60,60);
btn->setMaximumSize(6000,6000);
if(i == 0)
hBox4->addWidget(btn, 27);
else if(i == line4.size()-1)
hBox4->addWidget(btn, 32);
else
hBox4->addWidget(btn, 12);
}
//第六行
QHBoxLayout *hBox5 = new QHBoxLayout;
hBox5->setMargin(0);
hBox5->setSpacing(0);
QStringList line5 = {"Ctrl", "Win", "Alt", "", "Alt", "Fn", "Menu", "Ctrl"};
for (int i = 0; i < line5.size(); ++i)
{
QPushButton *btn = new QPushButton(line5.at(i));
btn->setMinimumSize(60,60);
btn->setMaximumSize(6000,6000);
if(line5.at(i).isEmpty())
hBox5->addWidget(btn, 74);
else
hBox5->addWidget(btn, 15);
}
//垂直布局
QVBoxLayout *vBox = new QVBoxLayout;
vBox->setMargin(0);
vBox->setSpacing(0);
vBox->addLayout(hBox0, 2);
vBox->addStretch(1);
vBox->addLayout(hBox1, 2);
vBox->addLayout(hBox2, 2);
vBox->addLayout(hBox3, 2);
vBox->addLayout(hBox4, 2);
vBox->addLayout(hBox5, 2);
this->setLayout(vBox);
大概就是先创建水平布局,
最后把这六个水平布局丢到垂直布局中,
唯一麻烦的地方就是要算好按钮比例。