#c #qt #paintevent
#c #qt #paintevent
Вопрос:
Я новичок в qt и делаю визуализацию красно-черного дерева с использованием qt c . я создал структуру узла, используя Qpaint, и у меня готов базовый код дерева структуры данных, единственная проблема заключается в обновлении события paint, потому что я тоже хочу вызывать событие paint, когда захочу.
а также при рисовании мои начальные узлы исчезают. пожалуйста, ознакомьтесь с кодом и помогите.
код является:
//dispaymenu.cpp
#include "displaymenu.h"
#include "ui_displaymenu.h"
#include "datastruct.cpp"
#include<QtCore>
#include<QtGui>
DisplayMenu::DisplayMenu(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::DisplayMenu)
{
ui->setupUi(this);
}
DisplayMenu::~DisplayMenu()
{
delete ui;
}
void DisplayMenu::paintEvent(QPaintEvent *)
{
createNode(text,col);
}
void DisplayMenu::createNode(QString text,char col)
{
QRectF rect(x,y,80,80); //create rectangle object which is not seen
QPainter p(this);
if(col=='b')
p.setBrush(Qt::black);
else if(col=='r')
p.setBrush(Qt::red);
p.drawEllipse(rect); //circle fits into the rect passed
p.setPen(Qt::white);
p.setFont(QFont("Arial", 15)); //to set font and size of text
p.drawText(rect, Qt::AlignCenter,text);
}
void DisplayMenu::setText()
{
bool ok;
text = QInputDialog::getText(this, tr("getText()"),
tr("getdata:"), QLineEdit::Normal,
QDir::home().dirName(), amp;ok);
if (ok amp;amp; !text.isEmpty())
{
int ele=text.toInt();
RBTree t1(a);
col=t1.insert(ele);
a=1;
createNode(text,col);
}
}
void DisplayMenu::on_textButton_clicked()
{
setText();
}
this was our mainwindow file.
//main.cpp
#include "displaymenu.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
displaymenu w;
w.show();
return a.exec();
}
//datastruct.cpp
#include <bits/stdc .h>
#include<datastruct.h>
#include<displaymenu.h>
#include"displaymenu.cpp"
using namespace std;
enum Color {RED, BLACK};
struct Node
{
int data;
char color;
Node *left, *right, *parent;
// Constructor
Node(int data)
{
this->data = data;
this->color='r';
left = right = parent =nullptr;
}
};
// Class to represent Red-Black Tree
class RBTree
{
public:
Node *root;
void rotateLeft(Node *amp;, Node *amp;);
void rotateRight(Node *amp;, Node *amp;);
void fixViolation(Node *amp;, Node *amp;);
// Constructor
RBTree(int a)
{
if(a==0)
root = nullptr;
}
char insert(int ele);
//void inorder();
//void levelOrder();
};
Node* BSTInsert(Node* root, Node *pt)
{
//DisplayMenu d(amp;p);
/* If the tree is empty, return a new node */
if (root == nullptr)
{
pt->color='b';
return pt;
}
/* Otherwise, recur down the tree */
if (pt->data < root->data)
{
root->left = BSTInsert(root->left, pt);
root->left->parent = root;
}
else if (pt->data > root->data)
{
root->right = BSTInsert(root->right, pt);
root->right->parent = root;
}
/* return the (unchanged) node pointer */
return root;
}
char RBTree::insert(int data)
{
Node *pt = new Node(data);
// Do a normal BST insert
root=BSTInsert(root, pt);
return pt->color;
// fix Red Black Tree violations
//fixViolation(root, pt);
}
Комментарии:
1. какой код у вас есть?
2. Добавил код к описанию. пожалуйста, проверьте, 🙂
Ответ №1:
Вызываю QWidget::update()
, чтобы создать новое событие рисования в вашем виджете. Событие будет обработано циклом событий как можно скорее.
Вы также можете принудительно выполнить вызов repaint QWidget::repaint
, но вы остановите цикл событий (так что, только если вам нужно мгновенное перерисовывание).
Комментарии:
1. сделал, но моя программа дает сбой. пожалуйста, вы можете проверить код и сказать, что не так. 🙂