Qt中QPushButton弹出独立窗口 如何将其添加到默认主窗口
问题根因
按钮单独弹出新窗口是写法错误导致的:
- 创建
QPushButton实例时没有指定父窗口对象,Qt规则里没有父对象的控件会被默认当作顶级独立窗口处理 - 主动调用了
buton1->show(),对于未绑定父对象的控件,这个调用会直接让它作为独立窗口弹出 - 代码顺序错误:先创建按钮再调用
ui->setupUi(this)初始化主窗口UI,主窗口的承载结构没初始化完成,控件无法正常挂载 - 额外注意:
QMainWindow有固定结构,所有业务控件不能直接挂在QMainWindow本身上,必须挂载到它自带的centralWidget中央部件上,否则就算指定父对象也会显示异常。
修正方案
- 把
ui->setupUi(this)移动到MainWindow构造函数的第一行,先完成主窗口基础UI初始化 - 创建
QPushButton时,第二个参数传入ui->centralWidget作为父对象,把按钮绑定到主窗口的中央部件上 - 删除单独给按钮写的
buton1->show()调用,父窗口显示时子控件会自动跟随渲染,不需要单独调用show - (可选优化)
main.cpp里同时写了w.setWindowState(Qt::WindowMaximized)和w.showFullScreen(),两个接口效果冲突:前者是窗口最大化(保留系统标题栏),后者是全屏模式(无标题栏占满整个屏幕),按需保留一个即可。
修正后的mainwindow.cpp完整代码:
#include "mainwindow.h" #include "ui_mainwindow.h" #include "QPushButton" #include "QDesktopWidget" #include <iostream> using namespace std; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { // 优先初始化主窗口UI ui->setupUi(this); // 创建按钮时直接绑定父对象为主窗口中央部件 QPushButton* buton1 = new QPushButton("Hello", ui->centralWidget); buton1->setGeometry(QRect(QPoint(100,100),QSize(200,50))); connect(buton1, &QPushButton::released, this, &MainWindow::buton_fonk); // 移除按钮单独的show调用 } void MainWindow::buton_fonk() { cout << "here" << endl; } MainWindow::~MainWindow() { delete ui; }
如果要使用普通窗口最大化效果,main.cpp可调整为:
#include "mainwindow.h" #include <QApplication> #include <QDesktopWidget> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.showMaximized(); return a.exec(); }
内容的提问来源于stack exchange,提问作者fatih_koca
相关产品推荐
相关产品推荐

