QT/Win32 QT ui 동작 프로세스 관련 질문드립니다.
페이지 정보
작성자
본문
mainwindow.cpp 보시면 생성자에 qDebug로 ui ptr을 출력하게 해놓았습니다.
ui ptr : 0x314cc0
ui ptr : 0x3184c0 ////// 프로그램 실행시키면 이렇게 qDeubg()가 두 번이 실행됩니다.
1. 이렇게 ui 주소가 두 번이 출력되는 이유를 알고 싶습니다.
2. on_pushButton_1_clicked() 클릭 이벤트를 통해서는 ListWidget에 출력이 되지만 connect로 연결시킨 이벤트로는 ListWidget이 출력되지 않습니다.
두 개의 이벤트 모두 전송받은 데이터는 qDebug()로 확인되지만, connect로 연결시킨 데이터만 ListWidget에 출력되지 않습니다.
qDebug() << "ui2 ptr : " << ui; 로 확인해보니 클릭 이벤트의 ui 주소는 0x314cc0이고 connect 이벤트의 ui 주소는 0x3184c0 입니다.
3. connect(this, SIGNAL(sendSerial(const QByteArray)), &window, SLOT(showSerial(const QByteArray)));
위에서 window를 MainWindow *window;와 같이 포인터로 변환하면 MOC에서 이상이 생기는지 프로그램이 켜짐과 동시에 멈춥니다. connect 연결할때 window 앞에 붙은 참조연산자 없앴습니다. 이유가 뭔지 알고 싶습니다.
p.s. c언어를 사용하다 c++공부한지 얼마 안되어 개념이 부족할 수 있습니다. 양해 부탁드립니다.
////////////////////////mainwindow.cpp////////////////////////
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
{
qDebug() << "ui ptr : " << ui;
ui->setupUi(this);
ui->label_1->setText("Player");
ui->label_1->setFont(QFont("굴림",20));
ui->label_2->setText("Serial");
ui->label_2->setFont(QFont("굴림",20));
ui->label_3->setText("Socket");
ui->label_3->setFont(QFont("굴림",20));
ui->pushButton_1->setText("Start");
ui->pushButton_1->setFont(QFont("굴림",20));
ui->pushButton_2->setText("Stop");
ui->pushButton_2->setFont(QFont("굴림",20));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_1_clicked()
{
this->showSerial("why");
}
void MainWindow::showSerial(const QByteArray recvData)
{
qDebug() << "recvData : " << recvData;
ui->listWidget_1->addItem(recvData);
qDebug() << "ui2 ptr : " << ui;
}
////////////////////////mainwindow.h////////////////////////
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_1_clicked();
void showSerial(const QByteArray recvData);
private:
Ui::MainWindow *ui;
};
////////////////////////amu_serial.cpp////////////////////////
amu_serial::amu_serial(QObject *parent) : QThread(parent), m_serial(new QSerialPort(this))
{
connect(this, SIGNAL(sendSerial(const QByteArray)), &window, SLOT(showSerial(const QByteArray)));
}
void amu_serial::serReadData()
{
const QByteArray data = m_serial->readAll();
SerRecvData.append(data);
if(SerRecvData.contains(static_cast<unsigned char>(PACKET_ETX_ID)))
{
emit sendSerial(SerRecvData);
SerRecvData = nullptr;
}
}
////////////////////////amu_serial.h////////////////////////
class amu_serial : public QThread
{
Q_OBJECT
public:
explicit amu_serial(QObject *parent = nullptr);
signals:
void sendSerial(const QByteArray recvData);
private slots:
void serReadData();
private:
MainWindow window;
};
댓글목록
cryfreedom님의 댓글

1. 생성자가 두 번 불리는것 같은데 MainWindow창을 1개만 띄우는지 확인
2. 위와 동일, connect 맨 끝에 파라미터로 Qt::QueuedConnection 추가
3. window가 null pointer인 상태에서 connect를 해서 그런것 같은데 생성자에서 connect 하지말고 window 포인터를 넘겨준 후 connect
그누그님의 댓글의 댓글

제가 객체 개념이 부족해서 벌어진 상황 같습니다.
1. 초기 main에서 생긴 MainWindow 객체(이름: w) 그리고 w에서 생긴 Ui::MainWindow 객체(이름: ui)
2. 새로 만든 MainWindow 객체(이름: window) 그리고 window에서 생긴 Ui::MainWindow 객체(이름: ui)
1번과 2번이 서로 다른 객체이고 그 안에서 생긴 ui 역시 다른 객체인데 이름이 같아서 헷갈렸습니다.
아직 수정하지 않아서 2번의 ui 포인터를 1번 ui포인터로 수정하면 될지 모르겠습니다.
미리 댓글 남깁니다.
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
그누그님의 댓글의 댓글

void MainWindow::sendUi() 함수만 실행시켜주면 객체가 달라도 ui 주소값은 기존 주소값과 동일해집니다.
이런식으로 해서 구현이 되긴 됐는데 좋은 방법은 아닌것 같습니다.
//////////////////////////////////////////////////이후에 싱글톤 패턴으로 다시 구현했습니다.
#include "mainwindow.h"
#include "ui_mainwindow.h"
Ui::MainWindow *pUi;
char uiCnt = 0;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->pushButton_1->setText("Start");
ui->pushButton_1->setFont(QFont("굴림",20));
ui->pushButton_2->setText("Stop");
ui->pushButton_2->setFont(QFont("굴림",20));
m_serial.serialLink(ui);
m_serial.openSerialPort();
m_server.startServer();
uiCnt++;
if(uiCnt == 1)
{
pUi = ui;
}
else uiCnt = 1;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_1_clicked()
{
ui->listWidget_2->addItem("OK");
}
void MainWindow::on_pushButton_2_clicked()
{
ui->listWidget_2->clear();
}
void MainWindow::sendUi()
{
ui = pUi;
}