QPushButton在MainWindow中无法点击

时间:2017-01-18 21:04:15

标签: c++ xcode qt

我在Xcode中编写了一个QT项目,我在QT编辑器中创建了一个Widget应用程序并使用了" qmake -spec macx-xcode"将项目转换为Xcode项目。

我有一个标准项目:

的main.cpp

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

主窗口.cpp

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new   Ui::MainWindow)
{

    m_button = new QPushButton(this);
    m_button -> setText("button");
    m_button->setGeometry(QRect(QPoint(100, 100),QSize(200, 50)));
    QPushButton *workingButton = new QPushButton("Hello");
    workingButton -> show();
    connect(m_button, SIGNAL(clicked()), this, SLOT(quitButton()));
    ui->setupUi(this);
}
void MainWindow::quitButton() {
     m_button->setText("Example");
}

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

主窗口

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{

    Q_OBJECT

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

    ~MainWindow();

private slots:
    void quitButton();


private:
    Ui::MainWindow *ui;
    QPushButton *m_button;
};

#endif

m_button显示在mainWindow中但是它不可点击但是workingButton显示在它自己的单独窗口中,而在connect中,当我用workingButton替换m_button时,它能够调用该函数。知道为什么m_button没有发送信号或没有被调用的函数?

1 个答案:

答案 0 :(得分:2)

原因很简单:您在m_button之上覆盖了其他透明小部件。您必须确保该按钮不被其他任何内容覆盖。例如。在setupUi调用使按钮成为中央窗口小部件的子项后,移动按钮的创建。一般来说,setupUi调用应该是小部件构造函数中的第一件事。

您也不需要动态分配子窗口小部件:更喜欢按值保存:减少事情可能会出错,而且您的开销也会减少!

因此,假装Ui_MainWindow类实际上是由uic生成的:

screenshot of the example

// https://github.com/KubaO/stackoverflown/tree/master/questions/simple-button-main-41729401
#include <QtWidgets>

class Ui_MainWindow {
public:
   QWidget *central;
   QGridLayout *layout;
   QLabel *label;
   void setupUi(QMainWindow *parent);
};

class MainWindow : public QMainWindow, private Ui_MainWindow {
   Q_OBJECT
   QPushButton m_button{"Click Me"};
public:
   MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
      setupUi(this);
      m_button.setParent(centralWidget());
      m_button.setGeometry({{50, 50}, m_button.sizeHint()});
   }
};

void Ui_MainWindow::setupUi(QMainWindow *parent) {
   central = new QWidget{parent};
   layout = new QGridLayout{central};
   label = new QLabel{"Hello"};
   label->setAlignment(Qt::AlignCenter);
   label->setStyleSheet("background-color:blue; color:white;");
   layout->addWidget(label, 0, 0);
   parent->setCentralWidget(central);
   parent->setMinimumSize(200, 200);
}

int main(int argc, char ** argv) {
   QApplication app{argc, argv};
   MainWindow w;
   w.show();
   return app.exec();
}
#include "main.moc"