多个 QWidet 到一个 QMainWindow

Posted

技术标签:

【中文标题】多个 QWidet 到一个 QMainWindow【英文标题】:Multiple QWidets into one QMainWindow 【发布时间】:2013-01-22 22:18:57 【问题描述】:

我目前正在学习 Qt,我被困在使用多个 QWidget 和一个 QMainWindow 的问题上。

我已经建立了一个项目,其中包含 2 个 QWidgets 和一个 QMainWindow。这是我使用它的想法:根据需要设计两个 QWidget,将它们添加到主窗口对象,将按钮连接到正确的插槽并在需要时切换中心小部件。所以我从一个 QMainWindow 开始,然后添加了两个 QWidget,包括 cpp 文件、h 文件和 ui 文件。在两个 QWidget 上,我添加了一个 QPushButton,并将其命名为 pushButtonConvert。

然后我转到附加到 QMainWindow (mainwindow.cpp) 的 cpp 文件并执行以下操作:

EpochToHuman * epochToHuman = new EpochToHuman();
HumanToEpoch * humanToEpoch = new HumanToEpoch();

到目前为止,一切都很好。现在我想将按钮连接到主窗口对象中的插槽,但我找不到按钮。 epochToHuman->pushButtonConvert 似乎不存在,我找不到任何其他方式来获取按钮。那么,根据 Qt,我是在以一种不正确的方式思考还是我遗漏了什么?

再次尝试澄清我想要的内容: 我想在 QMainWindows 的 cpp 文件中使用 QWidget 中的元素。我希望能够做这样的事情:

//In object MainWindow.cpp
QWidget * a = new QWidget
//Let's say a is a custom widget with a label in it. This label is called Label
a->Label->setText("Hello, World!");
//This gives an error because a does not have a member called Label
//How can I change the text on the label of a?
//And I think if I will be able to change the text of this label, I will also be able to dance around with buttons as needed.

【问题讨论】:

您可以发布您的代码的精简版或指向它的链接吗?我很难理解你想要做什么。 我添加了一个指向源的链接和一些更多的文字,我希望现在更清楚了。 【参考方案1】:

您可以在MainWindow的构造函数中将pushButtonConvert按钮连接到MainWindow::convertFromEpochToHuman,使用:

connect(epochToHuman->ui->pushButtonConvert, SIGNAL(clicked(bool)), this, SLOT(convertFromEpochToHuman()));

您需要先公开ui 成员,就像您为HumanToEpoch 所做的那样。

您应该将小部件的声明移至MainWindow.h

// ...
private:
    Ui::MainWindow *ui;

    EpochToHuman * epochToHuman;
    HumanToEpoch * humanToEpoch;
 // ...

并像这样初始化它们:

epochToHuman = new EpochToHuman(this);
humanToEpoch = new HumanToEpoch(this);

【讨论】:

这首先给了我 ui 是私有的错误,所以在 epochtohuman.h 文件中我将 ui 定义移动到公共部分。之后出现以下错误:C:\Users\Jacko\Documents\GitHub\epochTimeConverter\mainwindow.cpp:18: error: C2027: use of undefined type 'Ui::EpochToHuman' C:\Users\Jacko\Documents\ GitHub\epochTimeConverter\mainwindow.cpp:18:错误:C2227:'->pushButtonConvert' 的左侧必须指向类/结构/联合/通用类型 是的,所以你必须在 ui_epochtohuman.h 中包含Ui::EpochToHuman 的定义。

以上是关于多个 QWidet 到一个 QMainWindow的主要内容,如果未能解决你的问题,请参考以下文章

将多个 QMainWindow 合二为一作为 QTabWidget 中的选项卡

如何在 QtCreator 的一个 QMainWindow 中添加多个主窗口?

如何以特定方式在 QMainWindow 上定位多个 QDockWidget

QT_4-QMainWindow

Qt5 QMainWindow使用

访问 QMainWindow 类变量 - Pyside/PyQt