Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: jodam от Декабрь 16, 2010, 16:29



Название: Рисование в определенном табе. QTabWidget
Отправлено: jodam от Декабрь 16, 2010, 16:29
Я добавил в MainWindow tabwidget, при помощи QtCreator... Все работает, добавляю в первый таб Label.. через тот же Creator, но возникла такая ситуация, рисовать во втором табе, а проблема состоит в том что, рисуется оно всех табах.... Как отрисовать непосредственно во втором табе?

вот полный код MainWindow.cpp
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "host.h"
#include "QDebug"
#include <QtGui>
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
 
 
   //connect(port,SIGNAL(newDataInPortSignal(QTime,const unsigned char *, const int)),this, SLOT(receiveMsg(QTime,const unsigned char *, const int)));
  // Host::connect(&abc, SIGNAL(valueChanged(int)),this, SLOT(setValue(int)));
   //connect(&port, SIGNAL(valueChanged(int)),this, SLOT(setValue(int)));
 
   ui->setupUi(this);
 
Qt::WindowFlags flags = 0;
flags = Qt::Popup;
 
QWidget::setWindowFlags(flags);
QWidget::showFullScreen();
 
QTimer *timer = new QTimer(this);
     connect(timer, SIGNAL(timeout()), this, SLOT(update()));
     timer->start(1000);
 
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
 
void MainWindow::logData(double zen,double az,double ot,int stkov)
{
   QString azm, otk, zeni;
 
   zeni=zeni.setNum(zen);
   azm=azm.setNum(az);
   otk=otk.setNum(ot);
 
 
ui->zenit->setText(zeni);
ui->azimut->setText(azm);
ui->otklonitel->setText(otk);
ui->signal->setText("");
if(stkov==0)
{
 ui->stk->setText("No");
}
else if(stkov==1)
{
 ui->stk->setText("Yes");
 
}
}
 
void MainWindow::onsysmsg(QString Smsg)
{
   if(Smsg=="Timeout occurred.") ui->signal->setText(QString::fromLocal8Bit("No signal"));
   //ui->mytxt->setPlainText(Smsg);
 
}
 
void MainWindow::paintEvent(QPaintEvent *)
{
    static const QPoint minuteHand[3] = {
        QPoint(7, 8),
        QPoint(-7, 8),
        QPoint(0, -70)
    };
 
    QColor minuteColor(127, 0, 127);
    QColor hourColor (0, 127, 127);
 
    int side = qMin(width(), height());
    QTime time = QTime::currentTime();
 
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.translate(width() / 2, height() / 2); // По центру
    painter.scale(side / 300.0, side / 300.0); //Маштабируемость
 
    painter.setPen(Qt::NoPen);
 
    painter.setPen(hourColor);
    for (int i = 0; i < 90; ++i) {
        painter.drawLine(88, 0, 96, 0);
        painter.rotate(4.0);
    }
    painter.setPen(Qt::NoPen);
    painter.setBrush(minuteColor);
 
    painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
    painter.drawConvexPolygon(minuteHand, 3);
    painter.restore();
 
    painter.setPen(minuteColor);
 
}
 
 


Название: Re: Рисование в определенном табе. QTabWidget
Отправлено: kirill от Декабрь 16, 2010, 17:07
Ты рисуешь прямо по главному окну.
Отнаследуйся от QWidget и переопредели ему paintEvent() и его пихай в таб.


Название: Re: Рисование в определенном табе. QTabWidget
Отправлено: ANtlord от Январь 25, 2011, 16:47
Ты рисуешь прямо по главному окну.
Отнаследуйся от QWidget и переопредели ему paintEvent() и его пихай в таб.

Последние три слова подскажите как реализовать.
Я так понимаю надо создать простую процедуру

void QTabWidget::paintEvent(QPaintEvent *e)
{
    QPainter img(this);
    img.drawLine(0,30,100,100);
}

Но где её запустить?


Название: Re: Рисование в определенном табе. QTabWidget
Отправлено: alexman от Январь 25, 2011, 18:24
Пипец! Справку смотри!


Название: Re: Рисование в определенном табе. QTabWidget
Отправлено: ANtlord от Январь 25, 2011, 19:25
>_< если бы я не пролистал справку, не погуглил, не потанцевал с бубном, не почитал книжек, я бы не стал писать на форум. Где сидят такие уважаемые гуру.
P.S. а как рисовать на widget (главном окне) я и так знаю


Название: Re: Рисование в определенном табе. QTabWidget
Отправлено: serg_hd от Январь 26, 2011, 15:30
ANtlord, народ наверное имел ввиду, что надо унаследоваться от QLabel (а лучше действительно просто от QWidget, надо смотреть по обстоятельствам), перегрузить его paintEvent(), и уже потом добавлять этот QLabel в нужный тебе таб, и так для каждого таба свой label :)
п.с. на будущее - когда выкладываешь код, то не выкладывай кучу лишнего, не относящегося к вопросу, этим только отбиваешь желание разбираться в нём


Название: Re: Рисование в определенном табе. QTabWidget
Отправлено: ANtlord от Январь 26, 2011, 15:52
Так я знаю как унаследовать новый элемент от QWidget. Поправьте если не так.
Код:
class canvas : public QWidget {
    Q_OBJECT
public:
   canvas(QWidget* parent=0):QWidget(parent){}
   ~canvas(){}

protected:
   void paintEvent(QPaintEvent*); //само рисование в другом месте создается, вы его наблюдали выше. Только вместо QTabWidget canvas
};

Но как его "прикрутить" (сделать дочерним окном я так понимаю). Я может и нубские вопросы задаю. Но тем не менее, пользуюсь Шлее и Google.


Название: Re: Рисование в определенном табе. QTabWidget
Отправлено: serg_hd от Январь 26, 2011, 16:03
так у QTabWidget же есть метод
Код
C
int addTab ( QWidget * page, const QString & label )
 
им и добавь

Но тем не менее, пользуюсь Шлее и Google.

это хорошо, но без assistant'а затраченное время не слишком производительно


Название: Re: Рисование в определенном табе. QTabWidget
Отправлено: ANtlord от Январь 26, 2011, 16:34
Этот метод, судя из документации, добавляет вкладку, а не область на вкладку.
Но я всё равно решил попробовать сначала продекларировал объект в своем классе canvas, мне он выдал ошибку, я дошел до банальности и продекларировал в QWidget. Все равно дает ошибки
error: no matching function for call to ‘QTabWidget::addTab(QWidget&, const char [6])’
qt4/QtGui/qtabwidget.h:79: candidates are: int QTabWidget::addTab(QWidget*, const QString&)
qt4/QtGui/qtabwidget.h:80: int QTabWidget::addTab(QWidget*, const QIcon&, const QString&)

Код:
QWidget q;
ui->tabWidget->addTab(q,"tab_5");


Название: Re: Рисование в определенном табе. QTabWidget
Отправлено: serg_hd от Январь 26, 2011, 16:37
Код
C++ (Qt)
QWidget* wt = new QWidget;
ui->tabWidget->addTab(wt, "tab_5");
 


Название: Re: Рисование в определенном табе. QTabWidget
Отправлено: ANtlord от Январь 26, 2011, 16:41
Спасибо, serg_hd, всё скомпилиоровалось, но ничего не изменилось))) но думаю тут я разберусь. Google и Docs помогут
P.S. Сори, добавилась вкладка, как я и думал. Но я надеялся что на существующую вкладку добавится виджет на котором можно будет рисовать =\


Название: Re: Рисование в определенном табе. QTabWidget
Отправлено: ANtlord от Январь 26, 2011, 17:29
В общем у меня всё получилось как я задумывал! надо было продеклалрировать точно также объект в параметрах canvas надо было указать родительское окно (ui->tab_5), затем отобразить его, а дальше вручную выставить размеры и местоположение. Всем спасибо, включая парня, который меня послал читать доки ;)