gpt4 book ai didi

c++ - 为什么我的 QBoxLayouts 不工作?

转载 作者:行者123 更新时间:2023-11-30 05:05:17 25 4
gpt4 key购买 nike

因此,我降低了几个等级,尝试使用简单的程序来掌握 Qt 工具的窍门。

首先,我在 main() 函数中尝试了一个简单的标签,然后在其中尝试了一个按钮。一切顺利。

接下来,我尝试了相同的操作,但在主窗口中(使用 Qt 创建的文档)。一键程序成功后,我做了一个双键程序,就这么简单。工作了。

然后,我尝试了 Qt 的 Box Layouts。在这些“主窗口”尝试中,我都没有更改 Qt 创建的 main.cpp 文件。

这是 mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = 0);
~MainWindow();

private:
QPushButton *button1;
QPushButton *button2;
};

#endif // MAINWINDOW_H

接下来是mainwindow.cpp文件:

#include "mainwindow.h"
#include <QPushButton>
#include <QHBoxLayout>

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("Two Button Example"));
resize(400,300);

button1 = new QPushButton(tr("Bye!"));
button1->setGeometry(0,0,200,30);
//button1->setParent(this);
connect(button1,SIGNAL(clicked()),this,SLOT(close()));
button1->show();

button2 = new QPushButton(tr("Hide B1!"));
button2->setGeometry(0,0,200,30);
//button2->setParent(this);
connect(button2,SIGNAL(clicked()),button2,SLOT(hide()));
button2->show();

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
setLayout(layout);
}

MainWindow::~MainWindow()
{

}

我正在学习这本书(特别是布局,第 2 章,查找对话框示例(本书第 16 页,或 pdf 文件的第 34 页):C++ GUI Programming with Qt 4 1st ed.pdf

对于这个具体问题,我还使用了这个:QHBoxLayout - Qt Examples and Tutorials我注意到了什么:

  • 注释 QHBoxLayout 部分,一直到“setLayout”函数,在程序中没有任何区别。我所做的任何测试都不受 QBoxLayout 的影响;
  • “setGeometry”函数设置小部件的位置(前两个参数)和大小(宽度和高度,后两个参数)。这个位置和parent widget相关,当没有分配parent时可能是屏幕本身;
  • 当按钮的“setParent”函数被注释并且“show”函数被取消注释时,按钮将分别显示在与 MainWindow 不同的窗口中。当我取消注释“setParent”功能时,按钮显示在主窗口内,按钮是否有“显示”功能没有区别。细节是,对于我引用的书,到目前为止没有任何示例需要声明父窗口小部件,Qt 的示例和教程站点中的示例也不需要;
  • 如果我不使用“setGeometry”函数,按钮就会很大,比如 600x600,随便什么。它们遵循上述关于其他功能的规则,但它们很大并且总是一个在另一个之上,而不是并排。书中大量使用的“sizeHint()”函数,同样没有效果;

显然,它们都遵循示例的相同语法和规则。那么,我做错了什么,或者没有在这里做什么?如果用“sizeHint()”函数启发我也没有问题,那就太好了。

提前致谢!

最佳答案

我什至不记得问题的根源,但我一直无法在窗口中使用布局。在我与 Qt 合作的公司中,我们使用中央小部件来管理布局,因此图表是:窗口 -> 中央小部件 -> 布局 -> 子小部件。如果我这样修改你的代码,它看起来像这样:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
setWindowTitle(tr("Two Button Example"));
resize(400,300);

auto *parentWidget = new QWidget;
auto button1 = new QPushButton(tr("Bye!"), parentWidget);
button1->setGeometry(0,0,200,30);
connect(button1,SIGNAL(clicked()),this,SLOT(close()));

auto button2 = new QPushButton(tr("Hide B1!"), parentWidget);
button2->setGeometry(0,0,200,30);
connect(button2,SIGNAL(clicked()),button2,SLOT(hide()));

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
parentWidget->setLayout(layout);
setCentralWidget(parentWidget);
}

此外,我不太明白如果布局稍后会重置按钮大小,您为什么要尝试设置按钮大小。要更改布局内的大小,您必须更改小部件的 sizeHint:

 setWindowTitle(tr("Two Button Example"));
resize(400,300);

auto *parentWidget = new QWidget;
auto button1 = new QPushButton(tr("Bye!"), parentWidget);
button1->setMaximumSize(20, 20);
connect(button1,SIGNAL(clicked()),this,SLOT(close()));

auto button2 = new QPushButton(tr("Hide B1!"), parentWidget);
button2->setMaximumSize(20, 20);
connect(button2,SIGNAL(clicked()),button2,SLOT(hide()));

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
parentWidget->setLayout(layout);
setCentralWidget(parentWidget);

关于c++ - 为什么我的 QBoxLayouts 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48480626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com