Russian Qt Forum
Ноябрь 23, 2024, 22:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Рисование в определенном табе. QTabWidget  (Прочитано 6700 раз)
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);
 
}
 
 
Записан
kirill
Гость
« Ответ #1 : Декабрь 16, 2010, 17:07 »

Ты рисуешь прямо по главному окну.
Отнаследуйся от QWidget и переопредели ему paintEvent() и его пихай в таб.
Записан
ANtlord
Гость
« Ответ #2 : Январь 25, 2011, 16:47 »

Ты рисуешь прямо по главному окну.
Отнаследуйся от QWidget и переопредели ему paintEvent() и его пихай в таб.

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

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

Но где её запустить?
Записан
alexman
Гость
« Ответ #3 : Январь 25, 2011, 18:24 »

Пипец! Справку смотри!
Записан
ANtlord
Гость
« Ответ #4 : Январь 25, 2011, 19:25 »

>_< если бы я не пролистал справку, не погуглил, не потанцевал с бубном, не почитал книжек, я бы не стал писать на форум. Где сидят такие уважаемые гуру.
P.S. а как рисовать на widget (главном окне) я и так знаю
« Последнее редактирование: Январь 25, 2011, 19:30 от ANtlord » Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #5 : Январь 26, 2011, 15:30 »

ANtlord, народ наверное имел ввиду, что надо унаследоваться от QLabel (а лучше действительно просто от QWidget, надо смотреть по обстоятельствам), перегрузить его paintEvent(), и уже потом добавлять этот QLabel в нужный тебе таб, и так для каждого таба свой label Улыбающийся
п.с. на будущее - когда выкладываешь код, то не выкладывай кучу лишнего, не относящегося к вопросу, этим только отбиваешь желание разбираться в нём
« Последнее редактирование: Январь 26, 2011, 15:39 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
ANtlord
Гость
« Ответ #6 : Январь 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.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #7 : Январь 26, 2011, 16:03 »

так у QTabWidget же есть метод
Код
C
int addTab ( QWidget * page, const QString & label )
 
им и добавь

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

это хорошо, но без assistant'а затраченное время не слишком производительно
« Последнее редактирование: Январь 26, 2011, 16:12 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
ANtlord
Гость
« Ответ #8 : Январь 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");
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #9 : Январь 26, 2011, 16:37 »

Код
C++ (Qt)
QWidget* wt = new QWidget;
ui->tabWidget->addTab(wt, "tab_5");
 
Записан

kubuntu/Win7/x64/NetBeans
ANtlord
Гость
« Ответ #10 : Январь 26, 2011, 16:41 »

Спасибо, serg_hd, всё скомпилиоровалось, но ничего не изменилось))) но думаю тут я разберусь. Google и Docs помогут
P.S. Сори, добавилась вкладка, как я и думал. Но я надеялся что на существующую вкладку добавится виджет на котором можно будет рисовать =\
« Последнее редактирование: Январь 26, 2011, 16:46 от ANtlord » Записан
ANtlord
Гость
« Ответ #11 : Январь 26, 2011, 17:29 »

В общем у меня всё получилось как я задумывал! надо было продеклалрировать точно также объект в параметрах canvas надо было указать родительское окно (ui->tab_5), затем отобразить его, а дальше вручную выставить размеры и местоположение. Всем спасибо, включая парня, который меня послал читать доки Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.098 секунд. Запросов: 23.