9つのボックスを描画する簡単なプログラムを作成しようとしています。これらのボックスの1つをクリックすると、「X」が描画されます。そこで、9つのボックスを描画し、ClickableLableというクラスを作成しました。このクラスはQLabelを継承し、関数mousePressEventを再実装するため、クリックしたすべてのラベルに画像を追加できます。
問題は、コンパイルすると、アプリケーションがクラッシュし、QtCreatorから「警告」が表示されることです。QObject::setParent:親を設定できません。新しい親は別のスレッドにあります。
私はスレッド/プロセスまたは同様のものを扱っていません。インターネットでこのエラーを検索しましたが、解決策が見つかりませんでした。
clickablelabel.h
#ifndef CLICKABLELABEL_H
#define CLICKABLELABEL_H
#include <QLabel>
#include <QPixmap>
#include <QMouseEvent>
class ClickableLabel : public QLabel
{
Q_OBJECT
public:
ClickableLabel(QWidget *parent = 0);
protected:
void mousePressEvent(QMouseEvent *ev);
private:
QPixmap *zero;
QPixmap *x;
};
#endif // CLICKABLELABEL_H
ClickableLabel.cpp
#include "clickablelabel.h"
ClickableLabel::ClickableLabel(QWidget *parent) :
QLabel(parent)
{;
x = new QPixmap("x.png");
}
void ClickableLabel::mousePressEvent(QMouseEvent *ev){
if (ev->button() == Qt::LeftButton) {
this->setPixmap(*x);
}
}
Mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "clickablelabel.h"
#include <QtGui>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
void set_up_widgets();
protected:
void paintEvent(QPaintEvent *event);
private:
ClickableLabel *lab1;
ClickableLabel *lab2;
ClickableLabel *lab3;
ClickableLabel *lab4;
ClickableLabel *lab5;
ClickableLabel *lab6;
ClickableLabel *lab7;
ClickableLabel *lab8;
ClickableLabel *lab9;
QHBoxLayout *lay1;
QHBoxLayout *lay2;
QHBoxLayout *lay3;
QVBoxLayout *layout;
};
#endif // MAINWINDOW_H
ClickableLabel.cpp
#include "clickablelabel.h"
ClickableLabel::ClickableLabel(QWidget *parent) :
QLabel(parent)
{;
x = new QPixmap("x.png");
}
void ClickableLabel::mousePressEvent(QMouseEvent *ev){
if (ev->button() == Qt::LeftButton) {
this->setPixmap(*x);
}
}
Main.cpp
#include "mainwindow.h"
void center(QWidget &widget){
QDesktopWidget *desktop = QApplication::desktop();
int x = 800;
int y = 600;
int sWidth = (desktop->width() - 800) / 2;
int sHeight = (desktop->height() - 600) / 2;
widget.setGeometry(sWidth, sHeight, x, y);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
center(w);
w.show();
return a.exec();
}
Mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
this->setWindowTitle("T");
this->setToolTip("T");
set_up_widgets();
}
void MainWindow::paintEvent(QPaintEvent *event){
QPainter painter(this);
QPen pen(Qt::blue, 7, Qt::SolidLine, Qt::RoundCap);
int x = this->width() - 14;
int y = this->height() - 14;
int thirth_x = x / 3;
int thirth_y = y / 3;
painter.setPen(pen);
painter.drawLine(thirth_x, 0, thirth_x, y);
painter.drawLine(thirth_x * 2 + 14, 0, thirth_x * 2 + 14, y);
painter.drawLine(0, thirth_y, x, thirth_y);
painter.drawLine(0, thirth_y * 2 + 14, x, thirth_y * 2 + 14);
}
void MainWindow::set_up_widgets(){
lab1 = new ClickableLabel(this);
lab2 = new ClickableLabel(this);
lab3 = new ClickableLabel(this);
lab4 = new ClickableLabel(this);
lab5 = new ClickableLabel(this);
lab6 = new ClickableLabel(this);
lab7 = new ClickableLabel(this);
lab8 = new ClickableLabel(this);
lab9 = new ClickableLabel(this);
lay1 = new QHBoxLayout();
lay2 = new QHBoxLayout();
lay3 = new QHBoxLayout();
lay1->addWidget(lab1);
lay1->addWidget(lab2);
lay1->addWidget(lab3);
lay2->addWidget(lab4);
lay2->addWidget(lab5);
lay2->addWidget(lab6);
lay3->addWidget(lab7);
lay3->addWidget(lab8);
lay3->addWidget(lab9);
layout->addLayout(lay1);
layout->addLayout(lay2);
layout->addLayout(lay3);
setLayout(layout);
}