我正在用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();
}


主窗口

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出现在其自己的单独窗口中,在连接中,当我将m_button替换为workingButton时,它可以调用该函数。知道为什么m_button不发送信号或未调用函数吗?

最佳答案

原因很简单:您在m_button上覆盖了其他透明小部件。您必须确保按钮没有被其他东西覆盖。例如。在setupUi调用后移动按钮的创建,或将按钮作为中央小部件的子级。一般来说,setupUi调用应该是小部件的构造函数中的第一件事。

您也不需要动态分配子窗口小部件:宁愿按值持有东西:更少的事情会出错,而且您的开销也更少!

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

c++ - QPushButton在MainWindow中不可点击-LMLPHP

// 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"

关于c++ - QPushButton在MainWindow中不可点击,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41729401/

10-11 16:17