Error cannot initialize object parameter of type qwidget with an expression of type mainwindow

This is the line of code that breaks when I moved my project from QT 5.12 to QT 5.15. setWindowFlags(Qt::Window | Qt::FramelessWindowHint); The error that is thrown is the following: mainwindow.cp...

This is the line of code that breaks when I moved my project from QT 5.12 to QT 5.15.

setWindowFlags(Qt::Window | Qt::FramelessWindowHint);

The error that is thrown is the following:

mainwindow.cpp:28:5: error: cannot initialize object parameter of type 'QWidget' with an expression of type 'MainWindow'

I am doing this migration because QT recommends moving to 5.15 before moving to QT 6. I have tried doing it the following way as well but gives me the same error.

    Qt::WindowFlags flags;
    flags |= Qt::Window;
    flags |=Qt::FramelessWindowHint;
    setWindowFlags(flags);

Here is the code for the whole MainWindow constructor there are several more errors in it as well, but for now lets focus on this one.

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    translator.load("://languages/translation_en.qm");
    qApp->installTranslator(&translator); 
    //Initial UI setup.
#ifndef DESKTOP
    /*
    Qt::WindowFlags flags;
    flags |= Qt::Window;
    flags |=Qt::FramelessWindowHint;
    setWindowFlags(flags);
    */
    setWindowFlags(Qt::Window | Qt::FramelessWindowHint); //this is the line in question
    setWindowState(Qt::WindowFullScreen);
#endif
    ui->setupUi(this);
    ui->remoteStatus->setVisible(false);
    ui->simpleRemoteStatus->setVisible(false);
    ui->simpleFrame->hide();
    ui->dashboardFrame->hide();
    ui->childFrame->hide();
    startButtonDown = ui->simpleStartButton->isChecked();
    stopButtonDown = ui->simpleStopButton->isChecked();
    setupIcons();
    //

    double hmiver = 380;//version number
#ifdef CYCLE
    hmiver = 999;
#endif

    //Setup for Modbus Slave
    thread = new QThread(this);
    data = new DataThread();
    data->moveToThread(thread);
    connect(thread, SIGNAL(started()), data, SLOT(runProcess()));
    //

    setupMenus();
    comsMod->RetainedData.HMIVer = hmiver;
    comsMod->RTData.HMIVer = hmiver;
    settingsMenu->aboutMenu->setHMIVer(hmiver);
    setupTimers();
    connectAll();

    //Starts RTM communications on device side
    DisplayCountTimer->setInterval(100);
    DisplayCountTimer->start();
    //After 2 seconds, starts remaining processes
    StartModbusTimer->setInterval(2000);
    StartModbusTimer->start();

    /* Used for cycle testing */
#ifdef USBTEST
    usbTest();
#endif
    /* Used for cycle testing */
#ifdef CYCLE
    this->on_productionButton_clicked();
#endif
}

I am working on Ubuntu 20.04

@Mucahit , I share with you this little fable I just invented in the spirit of making amends. Some forum threads (here and elsewhere, such as StackOverflow) seem to inevitably take on an «us versus them» («experts versus n00bs») aura, and I wish I could avoid it more easily. I offer this in the spirit of helping both sides (expert, n00b, and those in-between) to understand each other better.

You are trying to play a chess game against a chess opponent named Qt. You pick up a rook and move it to a part of the chessboard, and the chessboard (let’s assume it is a «smart chess board» with electronic detection of your move)… the chessboard beeps and balks and the game halts.

You show us a picture of your chessboard and we go «well of course it failed, you cannot move the rook like that, because it’s against the rules of chess.» Next you pick up a pawn and place it down somewhere. The chessboard beeps and fails again. Now we tell you: «well of course! You aren’t allowed to move a pawn in that way either.»

What is the solution in order to end this frustration?

The solution is learn the rules of chess (C++) before attempting to apply chess (C++) to this particular adversary (Qt).

(Apologies to Qt for casting it in an adversarial role, but all frameworks appear that way on some days…)

You could, of course, persist in learning both chess and Qt via this repeated method of trial and error. However, learning in this way is unnecessarily slow, frustrating, fragile, and incomplete. People will keep telling you «stop, don’t do that!» and it can be demoralizing for you and for the person warning you. Those of us trying to help are scratching our heads in bafflement thinking «why don’t they just read a booklet on the rules of chess (C++)?»

On the topic of reading the rules of C++:

While Qt changes yearly (or more) and is often underdocumented (or documented in hard-to-find corners of the web), the core of C++ (especially if you set aside concurrency) has been stable for decades and is documented in abundance in all kinds of media and in all the world’s major spoken languages.

There is a huge return on investment that you will enjoy by stepping back briefly to study C++.

Zorroh772

0 / 0 / 1

Регистрация: 23.02.2017

Сообщений: 11

1

15.09.2019, 12:38. Показов 5913. Ответов 6

Метки нет (Все метки)


Пытаюсь соединить сигнал со слотом. В основном выводе пишет QObject::connect: No such signal Form::sendData() in ..untitled2mainwindow.cpp:21. Через брейк поинт попал в файл новой формы moc_form.cpp и обнаружил следующие ошибки:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Form::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
    moc_form.cpp:79:72: warning: redundant parentheses surrounding declarator
    moc_form.cpp:80:67: error: no member named 'move' in namespace 'std'
 
void *Form::qt_metacast(const char *_clname)
    moc_form.cpp:116:21: error: cannot initialize object parameter of type 'QWidget' with an expression of type 'Form'
 
int Form::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
    moc_form.cpp:121:20: error: cannot initialize object parameter of type 'QWidget' with an expression of type 'Form'
    moc_form.cpp:126:32: error: cannot initialize a parameter of type 'QObject *' with an rvalue of type 'Form *'
    moc_form.cpp:73:40: note: passing argument to parameter '_o' here
 
QString Form::sendData(QString _t1)
    moc_form.cpp:140:73: error: no member named 'addressof' in namespace 'std'
    moc_form.cpp:141:5: error: no matching function for call to 'activate'
    qobjectdefs.h:401:17: note: candidate function not viable: no known conversion from 'Form *' to 'QObject *' for 1st argument
    qobjectdefs.h:402:17: note: candidate function not viable: no known conversion from 'Form *' to 'QObject *' for 1st argument
    qobjectdefs.h:400:17: note: candidate function not viable: requires 3 arguments, but 4 were provided

Файлы главной формы (на форме listWidget и кнопка)

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include "form.h"
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
 
private slots:
    void recieveData(QString);
 
    void on_pushButton_clicked();
 
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
 
void MainWindow::on_pushButton_clicked()
{
    Form *add1 = new Form;
    add1->show();
    QObject::connect(add1, SIGNAL(sendData()), this, SLOT(recieveData(QString str)));
}
 
void MainWindow :: recieveData(QString str){
    QString lst = str;
 
    ui->listWidget->addItem(lst);
}

Файлы второй формы (на форме lineEdit и кнопка)

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// h
#ifndef FORM_H
#define FORM_H
 
#include <QWidget>
 
namespace Ui {
class Form;
}
 
class Form : public QWidget
{
    Q_OBJECT
 
public:
    explicit Form(QWidget *parent = nullptr);
    ~Form();
 
private slots:
    void on_pushButton_clicked();
 
 
signals:
    QString sendData(QString);
 
private:
    Ui::Form *ui;
};
 
#endif // FORM_H
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//cpp
#include "form.h"
#include "ui_form.h"
 
Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
}
 
Form::~Form()
{
    delete ui;
}
 
void Form::on_pushButton_clicked()
{
    emit sendData(ui->lineEdit->text()); // вызываем сигнал, в котором передаём введённые данные
    close();
}

Вложения

Тип файла: 7z build-untitled2-Desktop_x86_windows_msvc2019_pe_32bit-Debug.7z (735.6 Кб, 0 просмотров)
Тип файла: 7z untitled2.7z (4.2 Кб, 0 просмотров)

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Эксперт .NET

5461 / 4233 / 1209

Регистрация: 12.10.2013

Сообщений: 12,224

Записей в блоге: 2

15.09.2019, 13:27

2

Цитата
Сообщение от Zorroh772
Посмотреть сообщение

обнаружил следующие ошибки:

Самая главная ошибка в вашем коде — несовпадение сигнатур методов сигнала и слота. У вас метод сигнала без параметра, а метод слота с параметром. Так делать нельзя, можно наоборот — метод сигнала с параметром, а слота без параметров.

Добавлено через 10 минут
Добавлю: сам метод сигнала определен верно, а вот соединение сигнала и слота с ошибкой.



0



Zorroh772

0 / 0 / 1

Регистрация: 23.02.2017

Сообщений: 11

15.09.2019, 14:07

 [ТС]

3

Таким образом?

C++ (Qt)
1
QObject::connect(&add1, SIGNAL(sendData(QString str)), this, SLOT(recieveData()));



0



insite2012

Эксперт .NET

5461 / 4233 / 1209

Регистрация: 12.10.2013

Сообщений: 12,224

Записей в блоге: 2

15.09.2019, 14:14

4

Цитата
Сообщение от Zorroh772
Посмотреть сообщение

Таким образом?

C++ (Qt)
1
QObject::connect(&add1, SIGNAL(sendData(QString str)), this, SLOT(recieveData(QString str)));

У вас что, в IDE подсказки не работают? Обычно после написания макроса SIGNAL/SLOT IDE сама выводит список имеющихся, вам достаточно выбрать нужный.



0



Zorroh772

0 / 0 / 1

Регистрация: 23.02.2017

Сообщений: 11

15.09.2019, 16:41

 [ТС]

5

Слот сразу выводит, а сигнал не выводит

Добавлено через 2 часа 5 минут
все ошибки решились заменой сборщика. Был msvc, стал MinGW, но по прежнему не видит сигнал

C++ (Qt)
1
2
3
QObject::connect: No such signal Form::sendData(QString str) in 
QObject::connect:  (sender name:   'Form')
QObject::connect:  (receiver name: 'MainWindow')



0



_SayHello

873 / 534 / 175

Регистрация: 30.07.2015

Сообщений: 1,739

15.09.2019, 19:09

6

Zorroh772, Замени:

C++
1
2
 signals:
    QString sendData(QString);

На

C++
1
2
 signals:
    void sendData(QString);



0



Анна по жизни

283 / 172 / 62

Регистрация: 13.03.2019

Сообщений: 416

19.09.2019, 17:05

7

C++ (Qt)
1
QObject::connect(&add1, SIGNAL(sendData(QString str)), this, SLOT(recieveData(QString str)));

Убираем оба str и будет вам счастье:

C++ (Qt)
1
QObject::connect(&add1, SIGNAL(sendData(QString)), this, SLOT(recieveData(QString )));

Вообще-то, об этом в документации написано.



0



This topic has been deleted. Only users with topic management privileges can see it.

  • What is the solution of this error? Can anybody help me in this? Thank you

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <iostream>
    #include <math.h>
    
    using namespace std;
    
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
        , m_timerId(0),
          m_steps(0),
          m_realTime (0.0)
    
    {
        ui->setupUi(this);
        m_timerId = startTimer(0);
        m_time.start();
    }
    
    MainWindow::~MainWindow()
    {
    
        cout << "Average time step: " << ( (double)m_realTime ) / ( (double)m_steps ) << " s" << endl;
    
        if ( m_timerId ) killTimer( m_timerId );
    
        if ( ui ) delete ui;
        ui = 0;
    
        //delete ui;
    }
    
    void MainWindow::timerEvent(QTimerEvent *event)
    {
        QMainWindow::timerEvent(event);
    
        float timeStep = m_time.restart();
        m_realTime = m_realTime + timeStep / 1000.0f;
    
        float roll      =  0.0f;
        float pitch     =  0.0f;
    
        if(ui->pushButtonAuto->isChecked())
        {
            roll  =  180.0f * sin( m_realTime /  10.0f );
            pitch =  90.0f * sin( m_realTime /  20.0f );
            ui->spinBoxRoll  ->setValue( roll      );
            ui->spinBoxPitch ->setValue( pitch     );
    
        }
        else {
            roll  = (float) ui->spinBoxRoll  ->value();
            pitch = (float) ui->spinBoxPitch ->value();
        }
    //    ui->widgetPFD->setRoll(roll);
    //    ui->widgetPFD->setPitch(pitch);
    //    ui->widgetSix->setRoll(roll);
    //    ui->widgetSix->setPitch(pitch);
    
        m_steps++;
    }
    
  • @suslucoder
    Which line is the error reported on?

  • @JonB sorry, i forgot to mention
    in ui-> setupUi->(this);

  • @suslucoder
    Hover your mouse over the setupUi word/method. What does the signature report? It should be void Ui_MainWindow::setupUi(QMainWindow *MainWindow)? Did you make changes to, say, the ui_mainwindow.h file? Delete all the files in the build output directory (i.e. debug/release depending on how you are building, where that ui_mainwindow.h is) and rebuild from scratch?

  • @JonB it works! thank you

  • @suslucoder
    What works? Do you mean the deleting of all intermediate files and rebuilding from scratch?

  • @suslucoder
    If you changed anything in ui_mainwindow.h this could happen. If you get what seems like an inexplicable error when compiling, wiping the output directory can sometimes resolve. However, this does not apply to normal, run-of-the-mill errors!

  • Это строка кода, которая сломалась, когда я перенес свой проект с QT 5.12 на QT 5.15.

    setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
    

    Выдается следующая ошибка:

    mainwindow.cpp:28:5: error: cannot initialize object parameter of type 'QWidget' with an expression of type 'MainWindow'
    

    Я выполняю эту миграцию, потому что QT рекомендует перейти на 5.15 перед переходом на QT 6. Я также пытался сделать это следующим образом, но выдает ту же ошибку.

        Qt::WindowFlags flags;
        flags |= Qt::Window;
        flags |=Qt::FramelessWindowHint;
        setWindowFlags(flags);
    

    Вот код всего конструктора MainWindow, в нем есть еще несколько ошибок, но пока сосредоточимся на этой.

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        translator.load("://languages/translation_en.qm");
        qApp->installTranslator(&translator); 
        //Initial UI setup.
    #ifndef DESKTOP
        /*
        Qt::WindowFlags flags;
        flags |= Qt::Window;
        flags |=Qt::FramelessWindowHint;
        setWindowFlags(flags);
        */
        setWindowFlags(Qt::Window | Qt::FramelessWindowHint); //this is the line in question
        setWindowState(Qt::WindowFullScreen);
    #endif
        ui->setupUi(this);
        ui->remoteStatus->setVisible(false);
        ui->simpleRemoteStatus->setVisible(false);
        ui->simpleFrame->hide();
        ui->dashboardFrame->hide();
        ui->childFrame->hide();
        startButtonDown = ui->simpleStartButton->isChecked();
        stopButtonDown = ui->simpleStopButton->isChecked();
        setupIcons();
        //
    
        double hmiver = 380;//version number
    #ifdef CYCLE
        hmiver = 999;
    #endif
    
        //Setup for Modbus Slave
        thread = new QThread(this);
        data = new DataThread();
        data->moveToThread(thread);
        connect(thread, SIGNAL(started()), data, SLOT(runProcess()));
        //
    
        setupMenus();
        comsMod->RetainedData.HMIVer = hmiver;
        comsMod->RTData.HMIVer = hmiver;
        settingsMenu->aboutMenu->setHMIVer(hmiver);
        setupTimers();
        connectAll();
    
        //Starts RTM communications on device side
        DisplayCountTimer->setInterval(100);
        DisplayCountTimer->start();
        //After 2 seconds, starts remaining processes
        StartModbusTimer->setInterval(2000);
        StartModbusTimer->start();
    
        /* Used for cycle testing */
    #ifdef USBTEST
        usbTest();
    #endif
        /* Used for cycle testing */
    #ifdef CYCLE
        this->on_productionButton_clicked();
    #endif
    }
    

    Я работаю над Ubuntu 20.04.

    1 ответ

    Я подозреваю, что вы перешли на Qt 5.15, но пытаетесь собрать проект в том же каталоге, что и с 5.12. А причина ваших проблем в том, что некоторые файлы сборки остались там после старой компиляции. Смешивание файлов сборки из двух разных версий Qt в одном и том же каталоге — 100 % путь к катастрофе.

    Поэтому он также сообщает о неправильной строке. Я почти уверен, что проблемная строка на самом деле такая: ui->setupUi(this); вместо setWindowFlags(Qt::Window | Qt::FramelessWindowHint);.

    Я настоятельно рекомендую иметь два отдельных каталога сборки. По одному для каждой версии.

    Или, если вам по какой-то странной причине нужен только один каталог сборки, всегда удаляйте содержимое предыдущей сборки. Или, по крайней мере, попробуйте перезапустить qmake и выполнить полную перестройку, но иногда это может не сработать. Просто надежнее удалить все содержимое из сборки предыдущей версии.


    0

    HiFile.app — best file manager
    21 Сен 2022 в 02:09

    я пытаюсь построить шаблонное приложение c ++, используя cmake с главным окном, определенным в файле .ui с именем main_window.xml. Я следовал некоторым учебникам и пытался собрать воедино подход, но мои знания в лучшем случае неоднородны, и я столкнулся с ошибкой, которую не знаю, как исправить.

    Кто-нибудь знает, где я иду не так, или я даже лаю правильное дерево.

    Вот основной.cpp

    #include <QApplication>
    #include "ui_main_window.h"
    int main(int argc, char *argv[])
    {
    QApplication app(argc, argv);
    QWidget *widget = new QWidget;
    Ui::MainWindow ui;
    ui.setupUi(widget);
    
    widget->show();
    return app.exec();
    }
    

    Вот CMakeLists.txt

    cmake_minimum_required(VERSION 2.8)
    
    PROJECT(test_proj)
    FIND_PACKAGE(Qt4 REQUIRED)
    
    # include the current binary output directory as thats where the intermediate Qt fiels will be placed
    INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
    
    INCLUDE(${QT_USE_FILE})
    ADD_DEFINITIONS(${QT_DEFINITIONS})
    
    # set sources of program
    # only files that need preprocessgin by Qt need be included
    SET(test_proj_SOURCES main.cpp)
    SET(test_proj_HEADERS ui_main_window.h)
    SET(test_proj_FORMS main_window.ui)
    
    # this block creates .cpp and .h files from the .ui files
    QT4_WRAP_CPP(test_proj_HEADERS_MOC ${test_proj_HEADERS})
    QT4_WRAP_UI(test_proj_FORMS_HEADERS ${test_proj_FORMS})
    # QT4_ADD_RESOURCES(test_proj_RESOURCES_RCC ${test_proj_RESOURCES})ADD_EXECUTABLE(test_proj ${test_proj_SOURCES}
    ${test_proj_HEADERS}
    ${test_proj_FORMS})
    
    TARGET_LINK_LIBRARIES(test_proj ${QT_LIBRARIES})
    

    Вот ошибка компиляции, которую я получаю

    Jonathans-MacBook-Pro:build jonathantopf$ make clean;make
    [ 50%] Generating ui_main_window.h
    Scanning dependencies of target laser_scan
    [100%] Building CXX object CMakeFiles/laser_scan.dir/main.cpp.o
    /projects/laser_scanner/src/main.cpp:49:17: error: cannot initialize a parameter of type 'QMainWindow *' with an lvalue of type
    'QWidget *'
    ui.setupUi(widget);
    ^~~~~~
    /projects/laser_scanner/build/ui_main_window.h:48:31: note: passing argument to parameter 'MainWindow' here
    void setupUi(QMainWindow *MainWindow)
    ^
    1 error generated.
    make[2]: *** [CMakeFiles/laser_scan.dir/main.cpp.o] Error 1
    make[1]: *** [CMakeFiles/laser_scan.dir/all] Error 2
    make: *** [all] Error 2
    Jonathans-MacBook-Pro:build jonathantopf$
    

    0

    Решение

    Ваше главное окно наследуется от QMainWindow, так что вы должны заменить QWidget в QMainWindow в вашей основной функции.

    Однако необычно иметь форму без класса формы. Я рекомендую вам создать класс, используя «Add new — Qt — Designer Form Class» в Qt Creator.

    2

    Другие решения

    Других решений пока нет …

    1. 1. Структура проекта
    2. 2. Внешний вид окон
    3. 3. main.cpp
    4. 4. mainwindow.h
    5. 5. mainwindow.cpp
    6. 6. anotherwindow.h
    7. 7. anotherwindow.cpp
    8. 8. Итог. Переключение между окнами
    9. 9. Видеоурок

    На днях один из читателей обратился ко мне за помощью по поводу вопроса, ответ на который он искал в интернете. У меня не так много свободного времени, но видимо звёзды сошлись так, что и время было и вопрос из разряда тех, в которых уже имелся определённый опыт.

    Так вот, суть вопроса заключалась в том, чтобы организовать переключение между главным окном и второстепенными. Да таким образом, чтобы открытое окно закрывалось, а вместо него открывалось второе окно. То есть, чтобы по нажатию кнопки в главном окне приложения открывать другое окно и одновременно закрывать главное окно. При это во втором окне содержится кнопка, по нажатию которой открывается главное окно, а второе окно закрывается соответственно.

    Структура проекта

    Структура проекта отличается от дефолтной наличием дополнительного класса, который будет отвечать за второстепенные окна.


    • anotherwindow.h

      — заголовочный файл второстепенного окна;

    • anotherwindow.cpp

      — файл исходных кодов второстепенного окна.

    Внешний вид окон

    Накидываем вот такие окошки с помощью дизайнера интерфейсов и в путь к программному коду.

    Переключение между окнами. Главное окно

    Переключение между окнами. Второстепенное окно

    main.cpp

    Данный файл, с которого стартует приложение, создаётся по умолчанию. Ничего здесь не меняем.

    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    

    mainwindow.h

    В заголовочном файле главного окна приложения необходимо подключить заголовочный файл окна второстепенного приложения.

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <anotherwindow.h>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private slots:
        // Слоты от кнопок главного окна
        void on_pushButton_clicked();
        void on_pushButton_2_clicked();
    
    private:
        Ui::MainWindow *ui;
        // второе и третье окна
        AnotherWindow *sWindow;
        AnotherWindow *thirdWindow;
    };
    
    #endif // MAINWINDOW_H
    

    mainwindow.cpp

    Инициализация обоих второстепенных окон производится в главном окне и с помощью системы сигналов и слотов эти окна показываются по сигналам от кнопок в главном окне. При этом главное окно будет закрываться.

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        // Инициализируем второе окно
        sWindow = new AnotherWindow();
        // подключаем к слоту запуска главного окна по кнопке во втором окне
        connect(sWindow, &AnotherWindow::firstWindow, this, &MainWindow::show);
    
        // Инициализируем третье окно
        thirdWindow = new AnotherWindow();
        // подключаем к слоту запуска главного окна по кнопке в третьем окне
        connect(thirdWindow, &AnotherWindow::firstWindow, this, &MainWindow::show);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        sWindow->show();  // Показываем второе окно
        this->close();    // Закрываем основное окно
    }
    
    void MainWindow::on_pushButton_2_clicked()
    {
        thirdWindow->show();  // Показываем третье окно
        this->close();    // Закрываем основное окно
    }
    

    anotherwindow.h

    #ifndef ANOTHERWINDOW_H
    #define ANOTHERWINDOW_H
    
    #include <QWidget>
    
    namespace Ui {
    class AnotherWindow;
    }
    
    class AnotherWindow : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit AnotherWindow(QWidget *parent = 0);
        ~AnotherWindow();
    
    signals:
        void firstWindow();  // Сигнал для первого окна на открытие
    
    private slots:
        // Слот-обработчик нажатия кнопки
        void on_pushButton_clicked();
    
    private:
        Ui::AnotherWindow *ui;
    };
    
    #endif // ANOTHERWINDOW_H
    

    anotherwindow.cpp

    И аналогично делаем обработчик кнопки во второстепенном окне. Разница заключается в том, что главное окно уже существует, поэтому нам необходимо послать сигнал в сторону главного окна, чтобы оно открылось.

    #include "anotherwindow.h"
    #include "ui_anotherwindow.h"
    
    AnotherWindow::AnotherWindow(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::AnotherWindow)
    {
        ui->setupUi(this);
    }
    
    AnotherWindow::~AnotherWindow()
    {
        delete ui;
    }
    
    void AnotherWindow::on_pushButton_clicked()
    {
        this->close();      // Закрываем окно
        emit firstWindow(); // И вызываем сигнал на открытие главного окна
    }
    

    Итог. Переключение между окнами

    В результате подобных манипуляций Вы получите возможность переключаться между окнами приложения, и при этом у Вас будет открыто всегда только одно окно приложения. Демонстрацию работы приложения Вы можете увидеть в видеоуроке.

    Видеоурок

    Источник

    I want to pass qwidget pointer to a function to get some widget back as a result of function actions. But the value of this pointer leaves the same as befoere. 0 today and after building subsurface on windows im getting a qwidget must construct a qapplication before a qwidget invalid parameter passed to c runtime function. By clicking accept all cookies, you agree stack exchange can store cookies on your device and disclose information in accordance with our cookie policy. I need to pass to the qtwidged inherited class an object but i get errors. I have an object dbmanager which allows me to insert data into the database and check the connection status.

    I also placed a couple of these unclear warning messages in the comments on the corresponding expressions in the. I just created upositionreport class like a subclass of uactorcomponent without any additional logic and here is a strange error. I dont understand because all my data types in my database are varchars not int. I want to show all may data in the database in my qtableview but the error. I think i solved it! For future reference, people can get an earlier version of xcode here (httpsdeveloper.

    Популярные запросы

    • Error cannot initialize object parameter of type ‘qwidget’ with an expression of type
    • Qt cannot initialize object parameter of type qwidget with an expression of type
    • Cannot initialize object parameter of type qwidget with an expression of type mainwindow
    • Cannot initialize object parameter of type ‘qwidget’ with an expression of types
    • Cannot initialize object parameter of type qwidget with an expression of type

    Понравилась статья? Поделить с друзьями:
  • Error cannot initialize library solidworks при активации
  • Error cannot initialize gfx
  • Error cannot init model by specified list of keywords ret 2
  • Error cannot init d3d or grf file has problem ок
  • Error cannot get phone encrypt state перевод