【问题标题】:Qt Creator - GUI from designer vs. GUI from code - how to access element's functionsQt Creator - 设计师的 GUI 与代码的 GUI - 如何访问元素的功能
【发布时间】:2018-02-16 06:46:50
【问题描述】:

我对某些 Qt 架构感到困惑。

当我在 Qt Designer 中设计 GUI 时,很容易将元素放在布局中(网格、框等),并创建一个插槽来连接具有特定操作的元素(例如按钮),并且操作代码不多.cpp 文件。

在相关的 .cpp 文件中,我可以通过 ui->element->do_something 访问这些元素,甚至可以从类中的不同函数访问这些元素;

当不使用设计器时,而是在 .cpp 中创建整个 GUI 内容(添加元素对象、将这些对象添加到布局、创建插槽等...)我无法访问我的例如ui->Button->do_something 之类的按钮。

我被困在ui->Layout->functions from layout,无法从类中的其他函数访问单个元素及其函数,如ui->textEdit->text();ui->Layout->textEdit->text()

那么我怎样才能访问这些元素呢?

恐怕我在这里遗漏了 Qt 架构的一个重要点或其他内容。

【问题讨论】:

  • 当您使用(引用)一个 object .. 该对象必须在您的代码中明确定义/范围.. ui 是一个对象.. 它是什么.. 它从哪里来的?尝试探索一个 qt 示例并跟踪它的 objects

标签: c++ qt user-interface qt-designer


【解决方案1】:

当您使用设计器时,会使用您的布局代码自动生成一个“Ui”文件,然后您可以通过 Ui::Mainwindow 进行访问,您可以在 QMainWindow 类中看到自动生成的该文件。

可以在默认构造函数中看到:

QMainWindow(parent), ui(new Ui::MainWindow)

所以 gui 文件中定义的每个组件都可以通过 ui::nameofyourcomponent 访问。

如果您手动编写代码,则您的元素没有任何“访问点”,因此您必须像代码和类的其他部分一样构建层次结构。

编辑:回答他的评论的一点 sn-p。

在你的标题中你可以声明:

private slots:
void doSomething();

private:
QPushButton* mybutton;
QLabel* mylabel;

在您的 Cpp 中:

connect(myButton, SIGNAL(clicked()), this, SLOT(doSomething) );

MyClass::doSomething()
{
   mylabel->setText("hello button!");
}

当然,您可以使用连接通过信号和插槽直接链接组件。

【讨论】:

  • 好的,像connect(pushButton, SIGNAL(clicked(bool)),this, SLOT(on_pushButton_action(pointer to element))); 这样的东西,而不是从指针声明一个对GUI元素有一些动作的函数可以完成这项工作吗?不太确定如何自己创建该层次结构。
  • 我编辑了答案,添加了您所要求的内容。我在那里添加是因为格式更好。
  • mylabel->setText("hello button!");
【解决方案2】:

设计师创建的所有对象都是ui 对象的公共成员,这就是您可以使用它们的原因。为了能够使用手动创建的对象,您必须在某处存储指向它的指针或引用。

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 2012-12-04
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多