我正在用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生成的:
// 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/