0

我从 Qt 开始,但我不明白。这是我的代码:

#include <QApplication>
#include <QtWebKitWidgets/QWebView>
#include <QMainWindow>
#include <QPushButton>

    QApplication a(argc, argv);
    QMainWindow *mWin = new QMainWindow();
    QPushButton *button = new QPushButton("Button");

    button->setGeometry(0,0,128,56);
    button->show();

    mWin->setGeometry(QRect(300,300,1024,640));
    mWin->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint);
    mWin->show();

    return a.exec();

当我启动程序时,它会生成一个按钮,但不会在主 GUI 上。相反,它位于我的 sceen 的左上角。如何使按钮成为主 GUI 的一部分?

4

4 回答 4

2

QMainWindow 和 QPushButton 都派生自 QWidget,并且通常,QWidget 可以独立显示自己,因此不需要附加到父级,尽管您可能希望对呈现给用户的小部件进行分组和组织。

对于初学者,我认为 QMainWindow 有点误导,因为您实际上并不需要它来显示小部件。例如,如果您只想显示按钮,您只需要创建 QPushButton 并调用 show:-

QPushButton pButton = new QPushButton("Test");
pButton->show();

尽管您很少真正想要这样做。实际上,虽然它看起来毫无意义,但您甚至可以创建一个 QWidget 并显示:-

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    w.show();
    return a.exec();
}

QWidget 现在可以成为所有其他小部件的父级,但您仍然无需定义 QMainWindow。

您可能希望显示其他小部件,而 Qt 使用父/子层次系统将它们链接在一起。除此之外,这里的一个优势是您不需要跟踪不同的小部件来释放它们的内存。完成后,您只需删除顶级项目,它可能是 QMainWidget、QDialog 或其他基于 QWidget 的对象。在 Windows 的情况下,您需要做的就是关闭它们,并且它们的子节点也会被清理。

可以通过不同的方式将小部件添加到 QMainWindow,具体取决于您要实现的目标。最终,您可能希望使用允许按逻辑排列对小部件进行分组的布局,但首先,如果您查看 QPushButton 的构造函数,您会发现它采用 QWidget* 的可选参数:-

QPushButton(QWidget * parent = 0)

这允许您将正在创建的小部件(在本例中为 QPushButton)附加到父级。因此,创建 QMainWindow,然后将其指针传递给 QPushButton。

QMainWindow* pWindow = new QMainWindow; // create the main window
QPushButton pButton = new QPushButton(pWindow); // create the push button

pWindow->show(); // Display the main window and its children.
于 2013-08-21T08:09:35.153 回答
0

您正在创建一个按钮和一个窗口,但您没有将它们关联在一起。因此,该按钮不是主 UI 的一部分。为了将按钮添加到主窗口,您应该添加以下行 -

mWin->setCentralWidget(button);

使用 Qt 创建用户界面时,最好避免显式设置几何图形。是一个很好的页面,描述了 Qt 中的布局。

此外,您似乎缺少一个主要功能。

于 2013-08-21T05:03:33.023 回答
0

您没有设置父子关系,您需要 QPushbutton 作为 QMainwindow 的子项。然后你可以在 QMainwindow 上看到 QPushbutton。

请试试这个,我不确定你到底想达到什么..但是下面的代码会给你一些关于如何进行的说明..

  QApplication a(argc, argv);
    QMainWindow *mWin = new QMainWindow();
    QPushButton *button = new QPushButton(mWin); // setting parent as QMainwindow
    button->setGeometry(0,0,128,56);
   // button->show();
//mWin->setCentralWidget( button );

    mWin->setGeometry(QRect(300,300,1024,640));
    mWin->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint);
    mWin->show()

;

于 2013-08-21T05:04:25.283 回答
0

为主窗口创建一个中央小部件,然后使用布局将按钮放置在中央小部件上。例如:

QMainWindow *mWin = new QMainWindow();

// Place the button in a layout
QHBoxLayout *layout = new QHBoxLayout;
QPushButton *button = new QPushButton("Button");
layout->addWidget(button);

// Set up a central widget for the main window
QWidget *centralWidget = new QWidget();
centralWidget->setLayout(layout);
mWin->setCentralWidget(centralWidget);

如果您以这种方式将按钮放入布局中(或作为中央小部件本身,如其他答案之一所示),则无需在按钮上设置几何图形,也无需调用setVisibleshow明确地在按钮上(但您仍然需要在主窗口上)。

考虑查看 Qt 的一些示例,例如应用程序示例以获取更多信息。

于 2013-08-21T05:06:55.470 回答