【问题标题】:QPushButton click event inside a QStackWidget is sent to parent windowQStackWidget 内的 QPushButton 点击​​事件被发送到父窗口
【发布时间】:2015-07-04 15:31:54
【问题描述】:

我有一个 MainWindow 类,其中有一个 QStackWidget。 在其中我还有另外 3 个小部件,每个小部件都是我自己从 QWidget 派生的自定义类。

在其中一个小部件中,我有一个按钮。

当我使用 QT Creator 并按下按钮上的 Go to slot.. 时,它会在 MainWindow 类中创建一个 on_button_clicked 事件。

如何更改它以在我的自定义类中包含事件?

更新: 我可以看到这些按钮位于 MainWindow 中。这是自动生成的,所以我不知道如何移动它。

代码: 主窗口.cpp:

#include "mainwindow.h"
#include  "ui_mainwindow.h"
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_2_clicked()
{
    QMessageBox::information(this, "Button 2 clicked!", "Click");
}

主窗口.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>668</width>
    <height>630</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QStackedWidget" name="stackedWidget">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>10</y>
      <width>531</width>
      <height>391</height>
     </rect>
    </property>
    <property name="currentIndex">
     <number>1</number>
    </property>
    <widget class="Stack1" name="page">
     <widget class="QPushButton" name="pushButton">
      <property name="geometry">
       <rect>
        <x>140</x>
        <y>110</y>
        <width>321</width>
        <height>121</height>
       </rect>
      </property>
      <property name="text">
       <string>Button on Stack1</string>
      </property>
     </widget>
    </widget>
    <widget class="Stack2" name="page_2">
     <widget class="QPushButton" name="pushButton_2">
      <property name="geometry">
       <rect>
        <x>110</x>
        <y>140</y>
        <width>371</width>
        <height>161</height>
       </rect>
      </property>
      <property name="text">
       <string>Button on stack2</string>
      </property>
     </widget>
    </widget>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>668</width>
     <height>25</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <customwidgets>
  <customwidget>
   <class>Stack1</class>
   <extends>QWidget</extends>
   <header>stack1.h</header>
   <container>1</container>
  </customwidget>
  <customwidget>
   <class>Stack2</class>
   <extends>QWidget</extends>
   <header>stack2.h</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

我希望按钮回调在我的自定义类 stack2.cpp 中

#include "stack2.h"

Stack2::Stack2(QWidget *parent) : QWidget(parent)
{

}

Stack2::~Stack2()
{

}

【问题讨论】:

  • 您可以将创建的插槽移动到您的班级。只要小部件有一个名为button 的子组件,该插槽就可以工作。由于某些原因,Qt Designer 有时会在奇怪的地方放置新的插槽。你在对应表单类的编辑器中使用“go to slot”吗?
  • 我尝试手动移动该功能,但它仍然不起作用。此外,我创建了 2 个按钮。一个在主页上的插槽,第二个在stackedwidget中的插槽,只有主页上的一个在工作。
  • 我更新了问题
  • 您正确地进行了促销,但您不应在主窗口表单中填写促销小部件的内容(即在其中放置按钮)。相反,将堆栈页面类创建为设计器表单类(就像MainWindow 但基于QWidget)并使用单独的表单编辑器将内容放入其中。或者,您可以在其构造函数中手动添加布局和按钮以堆叠页面。
  • 太棒了!现在明白了。非常感谢。

标签: qt


【解决方案1】:

您正确地进行了促销,但您不应在主窗口表单中填写促销小部件的内容(即在其中放置按钮)。相反,将堆栈页面类创建为设计器表单类(就像 MainWindow 但基于 QWidget)并使用单独的表单编辑器将内容放入其中。或者,您可以在其构造函数中手动添加布局和按钮以堆叠页面。

【讨论】:

  • 我使用设计器表单在不同的表单上添加按钮和内容 - 工作正常。
猜你喜欢
  • 2011-04-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2017-10-16
  • 1970-01-01
相关资源
最近更新 更多