Wie QMainWindow::centralWidget eine eigene Klasse übergeben?

Alles rund um die Programmierung mit Qt
Antworten
mireiner
Beiträge: 8
Registriert: 20. September 2014 22:03

Wie QMainWindow::centralWidget eine eigene Klasse übergeben?

Beitrag von mireiner »

Hallo,

bin Qt-Anfänger - es kann also gut sein, dass in meiner Herangehensweise ein grundlegender Denkfehler liegt.

Es geht um ein Qt v5.4 Windows Desktop Programm, dessen Grundgerüst mit dem Project-Wizard von Qt Creator angelegt wurde. Mit einer QMainWindow Klasse mit Menü und Dialogboxen, die danach im Qt Designer erstellt wurden. Alles also ganz klassisch.

Hinzugefügt wurde eine von QWidget abgeleitete Klasse "Paint", um darin in "paintEvent()" mit QPainter zu zeichnen. Danach wurde "Paint" im Qt-Designer dem "QMainwindows::centralWidget" zugeordnet. Auch das ist vermutlich ein Standardverfahren.

Dieser Klasse "Paint" soll nun eine eigene "Config" Klasse übergeben, bzw. in ihrer "paintEvent()" Funktion verfügbar gemacht werden. Leider ist es mir nicht gelungen, "Config" in einem zusätzlichen Parameter dem "Paint" Konstruktor zu übergeben:

Code: Alles auswählen

#include "ui_mainwindow.h"
#include "MyDialog.h"
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private slots:
    void on_actionNeu_triggered();
 
private:
    Ui::MainWindow *ui;
};
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   
    setWindowTitle(tr("Title"));
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_actionNeu_triggered()
{
    MyDialog dlg;
    dlg.setModal(true);
    dlg.exec();
}	

Code: Alles auswählen

// MainWindow-ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Nut</string>
  </property>
  <widget class="Paint" name="centralWidget"/>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>400</width>
     <height>26</height>
    </rect>
   </property>
   <widget class="QMenu" name="menuMy">
    <property name="title">
     <string>My</string>
    </property>
    <addaction name="actionNeu"/>
   </widget>
   <addaction name="menuMy"/>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
  <action name="actionNeu">
   <property name="text">
    <string>Neu</string>
   </property>
  </action>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <customwidgets>
  <customwidget>
   <class>Paint</class>
   <extends>QWidget</extends>
   <header>paint.h</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>	

Code: Alles auswählen

#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include "MeineZeichenfunktion.h"
#include "Config.h"
 
class Paint : public QWidget
{
public:
    Paint(QWidget * parent = 0, Config *C);
 
    Config *Conf;
 
protected:
    void paintEvent(QPaintEvent *);
};
 
Paint::Paint(QWidget * parent, Config *C)
{
    Conf = C;
};
 
void Paint::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
 
//--- Zeichenfunktionen mit Parameter Config Klasse --
    MeineZeichenfunktion Zeichenfunktion(&painter, Conf);
};	
Beim "Paint" Konstruktor gibt der Compiler die Fehler aus:
C2548: 'Paint::Paint': Fehlender Standardparameter für Parameter 2

C2664: 'Paint::Paint(const Paint &)' : Konvertierung von Argument 1 von 'QMainWindow *' in 'const Paint &' nicht möglich
Ursache: Konvertierung von 'QMainWindow *' in 'const Paint' nicht möglich
Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
Wo liegt da der Fehler in "Paint", bzw. seiner Ableitung von "QWidget"?

Da "Paint" in der "MainWindows.ui" Formdatei dem "MainWindow::centralWidget" zugewiesen wird, ist mir zudem nicht klar, wo im Qt C++ Code die "Paint" Klasse initialisiert wird, um dort "Paint" meine "Config" Klasse zu übergeben?

Wie kann die Übergabe von "Config" an "Paint" realisiert, bzw. der Zugriff auf "Config" in "paintEvent()" ermöglicht werden?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Wie QMainWindow::centralWidget eine eigene Klasse überge

Beitrag von Christian81 »

Du musst das '= 0' wegmachen oder für den Conig - Pointer auch einen Standartdwert übergeben -> C++ Grundlagen
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten