Ответы пользователя по тегу C++
  • Система плагинов?

    Mezomish
    @Mezomish
    1. Оформляете плагины в виде *.so, из которых наружу торчит одна-единственная функция: какая-нибудь «createPlugin()», которая создаёт и возвращает объект, унаследованный от вашего базового класса.
    2. Сваливаете все плагины в один заранее известный каталог.
    3. В основной программе проходите по всем файлам из этого каталога и грузите плагины функцией dlopen()
    4. Имея хэндл либы получаете указатель на вашу функцию «createPlugin» при помощи функции dlsym()
    5. Дёргаете функцию, получаете объект «плагин», сохраняете его куда-нибудь в список.
    6. Проходитесь по списку и выбираете нужный по весу.
    7. Выгружаете ненужные плагины.

    Начать курить доку можно отсюда, а дальше — по ключевым словам.
    Ответ написан
    1 комментарий
  • QML vs Qt Widgets — что предпотительнее для реализации интерфейса?

    Mezomish
    @Mezomish
    Насчёт производительности — разница только на старте, когда грузится и парсится QML. Далее на его основе создаются обычные «плюсовые» объекты в памяти, так что во время исполнения разницы не будет. А если ваш QML не супер-дупер навороченный, то вы и во время загрузки разницы не ощутите.
    Плюсы у QML — более компактное, более читабельное описание интерфейса, а также тот факт, что тенденция развития Qt однозначно идёт к QML. В Qt5 вроде бы от нативных виджетов понемногу отходят (тут врать не буду, возможно неправ).
    Ответ написан
    1 комментарий
  • Проблема с рисованием поверх виджета в Qt

    Mezomish
    @Mezomish
    Собсна, код:

    #include <QMainWindow>
    #include <QScrollArea>
    #include <QLabel>
    #include <QApplication>
    #include <QPainter>
    
    class MyLabel : public QLabel {
    protected:
    	virtual void paintEvent(QPaintEvent* e) {
    		QLabel::paintEvent(e);
    		
    		QPainter p(this);
    		
    		p.setPen(Qt::green);
    		p.drawLine(0, 0, 100, 100);
    	}
    };
    
    class ImageView : public QMainWindow {
    public:
    	
    	ImageView() : QMainWindow() {
    		QScrollArea* scr = new QScrollArea();
    		setCentralWidget( scr );
    		
    		QLabel* label = new MyLabel();
    		label->setPixmap(QPixmap("./moon_from_andrey.jpg"));
    		scr->setWidget(label);
    	}
    };
    
    
    int main(int argc, char* argv[]) {
    	QApplication app(argc, argv);
    	
    	ImageView view;
    	view.setGeometry(100, 100, 500, 400);
    	view.show();
    	
    	return app.exec();
    }
    
    


    Результат:

    Ответ написан
    1 комментарий
  • Проблема с рисованием поверх виджета в Qt

    Mezomish
    @Mezomish
    Унаследуйтесь от QLabel, переопределите его paintEvent, а в нём сначала вызовите QLabel::paintEvent(event);, после чего добавьте ваше собственное рисование.
    Ответ написан
    Комментировать
  • G++ и порядок линковки

    Mezomish
    @Mezomish
    Буквально недавно была отличная статья про компоновщик, почитайте.
    В частности,
    Другая важная деталь — это порядок событий; библиотеки привлекаются только, когда нормальная компоновка завершена, и они обрабатываются в порядке слева на право. Это значит, что если объект, извлекаемый из библиотеки в последнюю очередь, требует наличие символа из библиотеки, стоящей раньше в линии компоновки, то компоновщик не найдёт его автоматически.

    Кстати, qmake генерирует такое по дефолту или вы сами добавляли эти библиотеки в .pro, в секцию LIBS? Если второе, то измените порядок там.
    Ответ написан
    1 комментарий
  • Виджет для игры "Жизнь" на Qt?

    Mezomish
    @Mezomish
    А чем неудобно-то?
    void mousePressEvent( QMouseEvent* e ) {
        int row = e->pos().y() / CellSize;
        int column = e->pos().x() / CellSize;
    
        // do whatever you want
    
    }
    
    
    Ответ написан
    Комментировать