首页 > 解决方案 > 如何在 Qt 中制作一个在运行时同时打开 2 个窗口的程序?

问题描述

最初我是在我之前制作的主窗口中制作的

标签: c++qtqt5

解决方案


用主窗口打开第二个窗口(或对话框)并不复杂。

为了证明这一点,我制作了一个MCVE

C++ 源代码testQMainWindowWithQDialog.cc

// Qt header:
#include <QtWidgets>

class Dialog: public QDialog {
  private:
    QVBoxLayout _qVBox;
    QLabel _qLbl;

  public:
    Dialog(QWidget *pQParent = nullptr):
      QDialog(pQParent),
      _qLbl("the dialog")
    {
      setWindowTitle("the Dialog Window");
      _qVBox.addWidget(&_qLbl, 1, Qt::AlignCenter);
      setLayout(&_qVBox);
    }

    virtual ~Dialog() = default;

    Dialog(const Dialog&) = delete;
    Dialog& operator=(const Dialog&) = delete;
};

class MainWindow: public QMainWindow {
  private:
    Dialog _qDlg;
    QWidget _qWidgetCentral;
    QVBoxLayout _qVBox;
    QLabel _qLbl;

  public:
    MainWindow():
      QMainWindow(),
      _qDlg(this),
      _qLbl("the main window")
    {
      setWindowTitle("Test QMainWindow with QDialog");
      _qVBox.addWidget(&_qLbl, 1, Qt::AlignCenter);
      _qWidgetCentral.setLayout(&_qVBox);
      setCentralWidget(&_qWidgetCentral);
      _qDlg.show();
    }
};

// main application
int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  MainWindow qWinMain;
  qWinMain.show();
  // runtime loop
  return app.exec();
}

构建脚本CMakeLists.txt(为VS2017准备VS解决方案):

project(QMainWindowWithQDialog)

cmake_minimum_required(VERSION 3.10.0)

set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

find_package(Qt5Widgets CONFIG REQUIRED)

include_directories("${CMAKE_SOURCE_DIR}")

add_executable(testQMainWindowWithQDialog testQMainWindowWithQDialog.cc)

target_link_libraries(testQMainWindowWithQDialog Qt5::Widgets)

在 Windows 10、VS2017、Qt 5.13 上构建和运行:

testQMainWindowWithQDialog.exe(主窗口)的快照 testQMainWindowWithQDialog.exe 的快照(对话框)

一个Qt项目文件testQMainWindowWithQDialog.pro

SOURCES = testQMainWindowWithQDialog.cc

QT += widgets

在cygwin64(使用 X11 服务器)上构建和测试:

$ qmake-qt5 testQMainWindowWithQDialog.pro 

$ make && ./testQMainWindowWithQDialog 
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQMainWindowWithQDialog.o testQMainWindowWithQDialog.cc
g++  -o testQMainWindowWithQDialog.exe testQMainWindowWithQDialog.o   -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 
Qt Version: 5.9.4

./testQMainWindowWithQDialog(主窗口)的快照 ./testQMainWindowWithQDialog 的快照(对话框)

我仍然认为 OP 的代码中一定还有其他问题。


推荐阅读