crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
Young
  опции профиля:
сообщение 10.10.2013, 15:53
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 10.10.2013
Пользователь №: 3952

Спасибо сказали: 0 раз(а)




Репутация:   0  


доброго времени суток уважаемые знатоки, пол дня не могу решить, на первый взгляд, идиотскую проблемму. Хотел сделать прямоугольный виджет на главном окне. Сделал класс А, унаследованный от QWidget и класс B, унаследованный от QMainWindow. Объявил переменную типа А в классе В, инициализировал в конструкторе, сделал переменную производной от "centralwidget" класса В и покрасил её при помощи "setStyleSheet". Виджет класса А на окне не отобразился. Сделал переменную А самостоятельным окном - окно появилось нужного цвета. Для проверки сделал в классе В ещё одну переменную, но уже типа QWidget, проделал с ней все то же самое, что и с предыдущей - и все получилось. Не могли бы вы подсказать, в чем я ошибся. Код прилогается

Класс А
#ifndef MAINTOOLBAR_H
#define MAINTOOLBAR_H

#include "hc_qt_disp.h"
#include "properties.h"     //визуальные настройки

class MyToolbar;

class MainToolbar : public QWidget
{
    Q_OBJECT
    Q_PROPERTY( int wdg_name READ Name WRITE Rename )       //объявление свойства wdg_name

    public:

        MainToolbar( QWidget *parent );
        virtual ~MainToolbar();

        //свойство wdg_name
        int Name() const { return wdg_name; }
        void Rename( int name ) { wdg_name = name; }

        ..........

};

#endif // MAINTOOLBAR_H


конструктор класса А
MainToolbar::MainToolbar( QWidget *parent ) : QWidget(parent)
{}


класс В
#ifndef MAINRADAR_H
#define MAINRADAR_H

#include "hc_qt_disp.h"
#include "MainToolbar.h"

class MainRadar : public QMainWindow
{
    Q_OBJECT

    public:

        MainRadar();
        ~MainRadar();

    private:

        QWidget *Test_widget;       //!!!!! Test string !!!!!

        QWidget *centralwidget;
        QStatusBar *statusbar;
        QHBoxLayout *TB_layout;
        QSpacerItem *spacerItem;

        MainToolbar * upper_toolbar;

        void SetupUi( QMainWindow * main_window );
        void RetranslateUi( QMainWindow *main_window );

        ..............

};

#endif // MAINRADAR_H



конструктор класса В
MainRadar::MainRadar()
{
    SetupUi(this);
}


void MainRadar::SetupUi(QMainWindow *MainWindow)
{
    if (MainWindow->objectName().isEmpty())
        MainWindow->setObjectName(QString::fromUtf8("MainWindow"));

    centralwidget = new QWidget(MainWindow);
    centralwidget->setObjectName(QString::fromUtf8("centralwidget"));

//  !!! проверочный код, который работает !!!
//        Test_widget = new QWidget(centralwidget);
//        Test_widget->setGeometry(QRect(0, 0, 800, 600));
//        Test_widget->setStyleSheet("background-color: yellow");

    upper_toolbar = new MainToolbar();
    upper_toolbar->setGeometry(QRect(0, 0, 800, 600));
    upper_toolbar->setStyleSheet("background-color: red");

    ..................


} // setupUi


Цитата(Young @ 10.10.2013, 16:51) *
доброго времени суток уважаемые знатоки, пол дня не могу решить, на первый взгляд, идиотскую проблемму. Хотел сделать прямоугольный виджет на главном окне. Сделал класс А, унаследованный от QWidget и класс B, унаследованный от QMainWindow. Объявил переменную типа А в классе В, инициализировал в конструкторе, сделал переменную производной от "centralwidget" класса В и покрасил её при помощи "setStyleSheet". Виджет класса А на окне не отобразился. Сделал переменную А самостоятельным окном - окно появилось нужного цвета. Для проверки сделал в классе В ещё одну переменную, но уже типа QWidget, проделал с ней все то же самое, что и с предыдущей - и все получилось. Не могли бы вы подсказать, в чем я ошибся. Код прилогается

Класс А
#ifndef MAINTOOLBAR_H
#define MAINTOOLBAR_H

#include "hc_qt_disp.h"
#include "properties.h"     //визуальные настройки

class MyToolbar;

class MainToolbar : public QWidget
{
    Q_OBJECT
    Q_PROPERTY( int wdg_name READ Name WRITE Rename )       //объявление свойства wdg_name

    public:

        MainToolbar( QWidget *parent );
        virtual ~MainToolbar();

        //свойство wdg_name
        int Name() const { return wdg_name; }
        void Rename( int name ) { wdg_name = name; }

        ..........

};

#endif // MAINTOOLBAR_H


конструктор класса А
MainToolbar::MainToolbar( QWidget *parent ) : QWidget(parent)
{}


класс В
#ifndef MAINRADAR_H
#define MAINRADAR_H

#include "hc_qt_disp.h"
#include "MainToolbar.h"

class MainRadar : public QMainWindow
{
    Q_OBJECT

    public:

        MainRadar();
        ~MainRadar();

    private:

        QWidget *Test_widget;       //!!!!! Test string !!!!!

        QWidget *centralwidget;
        QStatusBar *statusbar;
        QHBoxLayout *TB_layout;
        QSpacerItem *spacerItem;

        MainToolbar * upper_toolbar;

        void SetupUi( QMainWindow * main_window );
        void RetranslateUi( QMainWindow *main_window );

        ..............

};

#endif // MAINRADAR_H



конструктор класса В
MainRadar::MainRadar()
{
    SetupUi(this);
}


void MainRadar::SetupUi(QMainWindow *MainWindow)
{
    if (MainWindow->objectName().isEmpty())
        MainWindow->setObjectName(QString::fromUtf8("MainWindow"));

    centralwidget = new QWidget(MainWindow);
    centralwidget->setObjectName(QString::fromUtf8("centralwidget"));

//  !!! проверочный код, который работает !!!
//        Test_widget = new QWidget(centralwidget);
//        Test_widget->setGeometry(QRect(0, 0, 800, 600));
//        Test_widget->setStyleSheet("background-color: yellow");

    upper_toolbar = new MainToolbar(centralwidget);
    upper_toolbar->setGeometry(QRect(0, 0, 800, 600));
    upper_toolbar->setStyleSheet("background-color: red");

    ..................


} // setupUi

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 10.10.2013, 17:09
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Цитата
upper_toolbar = new MainToolbar();

Добавьте upper_toolbar родителя:
upper_toolbar = new MainToolbar(centralwidget);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.10.2013, 17:46
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


используй компоновщики, для размещения одних виджетов внутри других
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Young
  опции профиля:
сообщение 11.10.2013, 9:27
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 10.10.2013
Пользователь №: 3952

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ilyabvt @ 10.10.2013, 18:09) *
Цитата
upper_toolbar = new MainToolbar();

Добавьте upper_toolbar родителя:
upper_toolbar = new MainToolbar(centralwidget);


(поздно заметил, не нашел кнопки редактировать, поместил свой пост ещё раз исправленный) Нет, так тоже не работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 11.10.2013, 11:15
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Young, от того, что ты назвал виджет centralwidget, центральным он не стал.
В классе QMainWindow есть
    QWidget *centralWidget() const;
    void setCentralWidget(QWidget *widget);

Если какой-то виджет myMainWidget надо сделать центральным в главном окне myMainWindow, то после создания myMainWidget надо в методе класса окна myMainWindow указать это:
setCentralWidget(myMainWidget);

Я не стала бы называть свой виджет centralwidget, чтобы не путать с centralWidget(). :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Young
  опции профиля:
сообщение 11.10.2013, 12:00
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 10.10.2013
Пользователь №: 3952

Спасибо сказали: 0 раз(а)




Репутация:   0  


да-да, привожу полный код

void MainRadar::SetupUi(QMainWindow *MainWindow)
{
    if (MainWindow->objectName().isEmpty())
        MainWindow->setObjectName(QString::fromUtf8("MainWindow"));

    centralwidget = new QWidget(MainWindow);
    centralwidget->setObjectName(QString::fromUtf8("centralwidget"));

        Test_widget = new QWidget(centralwidget);
        Test_widget->setGeometry(QRect(0, 0, 800, 600));
        //Test_widget->setStyleSheet("background-color: yellow");

//так пробовал
//    upper_toolbar = new MainToolbar(centralwidget);
//    upper_toolbar->setGeometry(QRect(0, 0, 800, 600));
//    upper_toolbar->setStyleSheet("background-color: red");

//и так пробовал
//this->setStyleSheet("MainToolbar {background-color: red;}");

//это окно. Оно работает
//upper_toolbar = new MainToolbar();
//upper_toolbar->setObjectName(QString::fromUtf8("widget"));
//upper_toolbar->show();

//и вот так пробовал
// upper_toolbar = new MainToolbar(centralwidget);
//Test_widget = upper_toolbar;
//Test_widget->setGeometry(QRect(0, 0, 800, 600));
//Test_widget->setStyleSheet("background-color: yellow");

//и ещё вот так. Test_widget_small это тоже QWidget
//который помещается QHBoxLayout, который в свою очередь
//помещается на Test_widget. Все без толку
    upper_toolbar = new MainToolbar(Test_widget);
    Test_widget_small = upper_toolbar;
    Test_widget_small->setGeometry(QRect(0, 0, 200, 200));
 
   Test_widget_small->setStyleSheet("background-color: red");
    //Test_widget->setStyleSheet("MainToolbar { background-color: rgba(0, 244, 0, 55%);}");

    spacerItem = new QSpacerItem(10, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

    MainWindow->setCentralWidget(centralwidget);

    statusbar = new QStatusBar(MainWindow);
    statusbar->setObjectName(QString::fromUtf8("statusbar"));
    MainWindow->setStatusBar(statusbar);

    TB_layout = new QHBoxLayout;
    //TB_layout->addWidget(upper_toolbar);
    //TB_layout->addWidget(Test_widget_small);
    TB_layout->addItem(spacerItem);
    Test_widget->setLayout(TB_layout);

    RetranslateUi(MainWindow);

    QMetaObject::connectSlotsByName(MainWindow);
} // setupUi


заметил интересную особенность QWidget в QHBoxLayout не отображался, отображались только его производные (QPushbutton). Зато QWidget рисуется на другом виджете, без компановщиков (или setstylesheet только так работают), Пока виджет остается таким с ним ещё можно работать, но стоит ему стать классом производным от QWigget - как все. А вот классы производные от QPushbutton отобразить получается, к сожалению мне это никак не помогает. Все, варианты закончились, похоже придется искать другие решения, а вместе с ними и все переделывать. Досадно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 11.10.2013, 12:44
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Смотри сюда:
tmpTest.pro
QT       += core gui
TARGET = tmpTest
TEMPLATE = app
SOURCES += main.cpp\
        mainwindow1.cpp
HEADERS  += mainwindow1.h
main.cpp
#include <QtGui/QApplication>
#include "mainwindow1.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow1 w;
    w.show();

    return a.exec();
}
mainwindow1.h
#ifndef MAINWINDOW1_H
#define MAINWINDOW1_H

#include <QtGui/QMainWindow>

class MainWindow1 : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow1(QWidget *parent = 0);
    ~MainWindow1();
};

#endif // MAINWINDOW1_H
mainwindow1.cpp
#include "mainwindow1.h"

#include <QtGui/QPushButton>
#include <QtGui/QHBoxLayout>

MainWindow1::MainWindow1(QWidget *parent)
    : QMainWindow(parent)
{
    this->setGeometry(QRect(100, 100, 500, 300));

    QPushButton *btn1 = new QPushButton("btn1");
    QPushButton *btn2 = new QPushButton("btn2");
    QPushButton *btn3 = new QPushButton("btn3");
    QWidget *widget1 = new QWidget();
    QWidget *widget2 = new QWidget();

    QHBoxLayout *hLayout = new QHBoxLayout();
    hLayout->addWidget(btn1);
    hLayout->addWidget(widget1);
    hLayout->addWidget(btn2);
    hLayout->addWidget(widget2);
    hLayout->addWidget(btn3);

    btn2->setStyleSheet("background-color: red");
    widget2->setStyleSheet("background-color: lime");

    QWidget *mainWidget = new QWidget();
    mainWidget->setLayout(hLayout);

    setCentralWidget(mainWidget);
}

MainWindow1::~MainWindow1()
{

}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 11.10.2013, 14:24
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


MainWindow1::MainWindow1(QWidget *parent)
    : QMainWindow(parent)
{
    //...
    //добавь это
    QPushButton *btn0 = new QPushButton("btn0");
    btn0->setGeometry(QRect(100, 500, 200, 50));
    btn0->setStyleSheet("background-color: yellow");
    btn0->show();
}

Young, когда ты пишешь так
Test_widget = new QWidget(bbb);
то bbb - это родительский виджет, а не родительский класс.

Не путай две вещи: "родительский класс" и "родительский виджет".

1) если ты создаешь widget класса childСlass, то childСlass может быть дочерним классом,
который наследуется от родительского класса parentClass.
В моем примере в main.cpp создается виджет w класса MainWindow1, класс MainWindow1 наследуется от родительского класса QMainWindow.

2) если ты хочешь отобразить widget класса childСlass, то ты должен
либо каким-то образом указать для него родительский виджет
либо отобразить его отдельным окном.
В моем примере
при создании виджетов w и btn0 не указан родительский виджет,
поэтому эти виджеты отображаются как отдельные окна,
при создании виджетов btn1, btn2, btn3, widget1, widget2 не указан родительский виджет,
но они с помощью addWidget размещены на hLayout,
а hLayout с помощью setLayout установлен для mainWidget,
при размещении виджеты обретают родительский виджет,
при создании виджета mainWidget не указан родительский виджет,
но с помощью setCentralWidget(mainWidget) виджет mainWidget обретает родительский виджет w,
а так как мы отображаем виджет w, то вместе с ним отображаются и все его дочерние виджеты.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Young
  опции профиля:
сообщение 11.10.2013, 14:53
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 10.10.2013
Пользователь №: 3952

Спасибо сказали: 0 раз(а)




Репутация:   0  


да, на счет QWidget-ов я погорячился - в layout-e пустой виджет сожрал спейсер. Но в отношении классов производных от QWidget все в силе, а это к сожалению ключевой момент
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Young
  опции профиля:
сообщение 11.10.2013, 15:31
Сообщение #10


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 10.10.2013
Пользователь №: 3952

Спасибо сказали: 0 раз(а)




Репутация:   0  


итак возвращаясь к вопросу - не знает ли кто - нибудь, как с помощью setstylesheet покрасить объект класса, унаследованного от QWidget? У меня почему то не получается
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 8.7.2025, 5:50